HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

解题报告:01背包的变种,每种物品可以有多件,只要稍微变动一下就可以转化为01背包,转化的方法就是假设这件物品有多件的话,就将这多件展开来,也就是把每种物品的每一件都看成是01背包里面的每一件物品。这样 就可以顺利的转化为01背包了。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 
 8 int w[2005],v[2005],ans[2005];
 9 
10 int main()
11 {
12     int T,n,m;
13     scanf("%d",&T);
14     while(T--)
15     {
16         scanf("%d %d",&n,&m);
17         int num = 0,p,h,c;
18         for(int i = 1;i <= m;++i)
19         {
20             scanf("%d %d %d",&p,&h,&c);
21             while(c--)
22             {
23                 v[++num] = p;
24                 w[num] = h;
25             }
26         }
27         memset(ans,0,sizeof(ans));
28         for(int i = 1;i <= num;++i)
29         for(int j = n;j >= v[i];--j)
30         ans[j] = max(ans[j],ans[j - v[i]] + w[i]);
31         printf("%d\n",ans[n]);
32     }
33     return 0;
34 }
View Code

 

posted @ 2013-10-17 22:09  xiaxiaosheng  阅读(265)  评论(0编辑  收藏  举报