我绝对不会告诉你我做了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;
}