列表

详情


NC15588. 一个背包问题

描述

现在有很多物品(它们是可以任意分割的),我们知道它们每个物品的总价值v和重量w1<=v,w<=10);如果给你一个背包它能容纳的重量为m0<=m<=20,你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。

输入描述

第一行输入两个正整数s,m,(1<=s<=10)以空格分隔,s表示有s个物品。接下来的s行每行有两个用空格分隔的正整数v,w。

输出描述

输出每组测试数据中背包内的物品的价值和,保留2位小数,每次输出占一行。

示例1

输入:

5 5
5 2
5 3
6 2
4 3
10 2

输出:

18.50

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 392K, 提交时间: 2022-11-09 19:17:04

/*@刘学谦*/
#include<bits/stdc++.h>
using namespace std;
typedef struct good{
	double v,w;
	double c;
}good;
bool cmp(good x,good y){
	return x.c>y.c;
}
int main(void)
{
	good G[15];
	int s,m;
	cin>>s>>m;
	for(int i = 0;i<s;i++){
		cin>>G[i].v>>G[i].w;
		G[i].c = G[i].v/G[i].w;
	}
	sort(G,G+s,cmp);
	int N = m;
	double ans = 0;
	for(int i = 0;i<s&&N!=0;i++){
		if(N>=G[i].w){
			ans = ans+G[i].v;
			N = N-G[i].w;
		}else{
			ans = ans+N*G[i].c;
			N = 0;
		}
	}
	printf("%.2lf",ans);
 	return 0;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 408K, 提交时间: 2022-03-05 14:44:15

#include <bits/stdc++.h>
using namespace std;
int s,m,k=0,a[120],b[120],f[120][200005];
int main()
{
	cin>>s>>m;
	for(int i=1;i<=s;i++)
	{
		cin>>a[i]>>b[i];
		k+=b[i];
	}
	int g=1;
	double c[k];
	for(int i=1;i<=k;i++)
	{
		double t=a[i]*1.0/b[i];
		for(int j=g;j<g+b[i];j++)
		{
			c[j]=t;
		}
		g+=b[i];
	}
	sort(c+1,c+1+k);
	double ans=0;
	while(m--)
	{
		
		ans+=c[k];
		k--;
	}
	printf("%.2lf",ans);
	return 0;
}

pypy3(pypy3.6.1) 解法, 执行用时: 38ms, 内存消耗: 18680K, 提交时间: 2021-04-14 23:11:10

N, M = map(int,input().split())
f = []

for i in range(N):
    t = []
    t = list(map(int,input().split()))
    t.append(t[0]/t[1])
    f.append(t)

f.sort(key=lambda x:x[2], reverse = True)

max_value = 0
for i in range(len(f)):
    if M >= f[i][1]:
        M -= f[i][1]
        max_value += f[i][0]
    else:
        max_value += (M * f[i][2])
        break

print("{:.2f}".format(max_value))

Python3(3.5.2) 解法, 执行用时: 37ms, 内存消耗: 3432K, 提交时间: 2020-05-31 21:41:56

n,m = [int(a) for a in input().split()]
X = [[int(a) for a in input().split()] for i in range(n)]

X.sort(key=lambda x:x[1]/x[0])
r = 0
for x in X:
    if m>x[1]:
        r,m = r+x[0],m-x[1]
    else:
        r += x[0]*m/x[1]
        break
print('{:.2f}'.format(r))

上一题