描述
-
输入
-
第一行输入一个正整数n(1<=n<=5),表示有n组测试数据;
随后有n测试数据,每组测试数据的第一行有两个正整数s,m(1<=s<=10);s表示有s个物品。接下来的s行每行有两个正整数v,w。
输出
- 输出每组测试数据中背包内的物品的价值和,每次输出占一行。 样例输入
-
1 3 15 5 10 2 8 3 9
样例输出
-
65
-
其实这道题看的时候没有认真读题,错以为是有好几个同样的物品可以放进背包,以致我不会做题了
-
后老才发现那价值是各个物品的戴维重量的价值 这样一看题目就更不难了 以此来提醒我自己 要好好读题!!!!
-
-
<pre name="code" class="cpp">#include <stdio.h> struct Beibao { int v;//题意中v为每个物品的单位重量的价值 int w;//每个物体的总重量 }; int main() { int k; Beibao a[11],t; scanf("%d",&k); while(k--) { int s,m; scanf("%d%d",&s,&m);//s为物品件数 m为总限重 int i,j; for(i=0;i<s;i++) scanf("%d%d",&a[i].v,&a[i].w); for(i=0;i<s-1;i++) for(j=i+1;j<s;j++) { if(a[i].v<a[j].v) { t=a[i]; a[i]=a[j]; a[j]=t; } } int x=0,y=0; for(i=0;i<s;i++) { if((x+a[i].w)<m) { x=x+a[i].w; y=y+a[i].w*a[i].v; } else { y=y+(m-x)*a[i].v;//重量加起来不超过限重的就直接计算价值 超过或等于了就分隔算一下在原来价值的基础上又能增加多少 求总和即可 break; } } printf("%d\n",y); } return 0; }