可分割背包问题

我绝对不会告诉你我做了8遍才过这道题

题目

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

Input

第一行输入一个正整数n (1<=n<=5),表示有 n组测试数据; 随后有 n组测试数据,每组测试数据的第一行有两个正整数s(1<=s<=10); s表示有s 个物品。接下来的 s行每行有两个正整数 v,w。

Output

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

样例输入

1
3 15
5 10
2 8
3 9

样例输出

65

样例解释

方案:第一个物品全部放进去,第三个物品放5个单位的重量进去
总价值为5×10+3×5 = 65.

code:

点击查看代码
#include <bits/stdc++.h>
using namespace std;
int n,m,sum,ans;//n:组数,m:背包容积,sum:物品个数 
struct abc{
	int v,w;
}a[21];
bool cmp(abc x,abc y){
	return x.v > y.v;
}
int main(){
	cin>>n;
	for(int i = 1;i<=n;i++){
		ans = 0;
		cin>>sum>>m;
		for(int k = 1;k<=sum;k++){
			cin>>a[k].v>>a[k].w;
		}
		sort(a+1,a+sum+1,cmp);
		for(int j = 1;j<=sum;j++){
			if(m >= a[j].w) {m -= a[j].w;ans += a[j].v*a[j].w;}
			else {ans += a[j].v*m;break;}
		}
		cout<<ans<<endl;
	}
	return 0;
}
posted @ 2023-07-02 13:09  nasia  阅读(26)  评论(0)    收藏  举报