背包问题

贪心
描述
现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10);如果给你一个背包它能容纳的重量为m(10<=m<=20),你所要做的就是把物品装到背包里,使背包里的物品的价值总和最大。
输入
第一行输入一个正整数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
 1 #include<stdio.h>
 2 typedef struct value
 3 {
 4     int v;/*价值*/
 5     int w;/*重量*/
 6 }thing;
 7 int main()
 8 {
 9     int n;
10     scanf("%d",&n);
11     while(n--)
12     {   
13         int s,m,j,i=0,sumv=0,sumw=0;
14         scanf("%d%d",&s,&m);
15         thing a[s],t;
16         while(i!=s)
17         {
18             scanf("%d%d",&a[i].v,&a[i].w);
19             i++;
20         } 
21         for(i=0;i<s-1;i++)
22             for(j=i;j<s;j++)
23             {
24                 if(a[i].v<a[j].v)
25                 {
26                     t=a[i];
27                     a[i]=a[j];
28                     a[j]=t;
29                 }
30             }
31         int ww=0,vv=0;
32         i=0;
33         while(sumw<m)
34         {
35             ww=sumw;
36             vv=sumv;
37             sumw=sumw+a[i].w;
38             sumv=sumv+a[i].w * a[i].v;
39             i++;
40             while(i==s)
41                 break;
42         }
43         if(sumv>m)
44               sumv=vv+(m-ww)*a[i-1].v;
45         printf("%d\n",sumv);
46     }
47 }

 

posted @ 2015-04-25 11:16  御心飞行  阅读(249)  评论(0编辑  收藏  举报