码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2014-08-02 20:48:04      阅读:261      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   io   for   代码   div   

标准的多重背包应用,只要 看了 背包九讲应该就会做了的题目;

用结构体做比较省事;

这题比较蛋疼的是 中间把 数量打成重量,找了半天也找不出来,又看了几遍PO3还是没找出来...抱着奇怪的心里,搜了一下.我去...

唉..以后要好好注意写代码的习惯了...

 1 #include<iostream>
 2 #define maxn 105
 3 #define max(a,b) (a>b?a:b)
 4 int dp[maxn];
 5 int n,m,t;
 6 struct node
 7 {
 8     int amount,weight,price;
 9 }game[maxn];
10 void zeroOnePack(int cost,int weight)
11 {
12     for(int i=n;i>=cost;i--)
13         dp[i]=max(dp[i],dp[i-cost]+weight);
14 }
15 void completePack(int cost ,int weight)
16 {
17     for(int i=cost;i<=n;i++)
18         dp[i]=max(dp[i],dp[i-cost]+weight);
19 }
20 void multiPack(int cost,int weight,int amount)
21 {
22     
23       if(cost * amount >= n)
24         completePack(cost,weight);
25      else
26     {
27         int k=1;
28         while( k< amount)
29         {
30             zeroOnePack(k*cost,k*weight);
31             amount-=k;
32             k*=2;
33         }
34         zeroOnePack(amount*cost,amount*weight);
35      }
36 }
37 
38 int main()
39 {
40     //freopen("2191.txt","r",stdin);
41     int i,j;
42     while(~scanf("%d",&t))
43     {
44         while(t--)
45         {
46             memset(dp,0,sizeof(dp));
47             memset(game,0,sizeof(game));
48             scanf("%d %d" ,&n,&m);
49                 for(i=0;i<m;i++)
50                     scanf("%d %d %d",&game[i].price,&game[i].weight,&game[i].amount);
51              for(i=0;i<m;i++)
52                 multiPack(game[i].price,game[i].weight,game[i].amount);
53              printf("%d\n",dp[n]);
54         }
55     }
56     return 0;
57 }

 

HDU2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活,布布扣,bubuko.com

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

标签:style   blog   color   os   io   for   代码   div   

原文地址:http://www.cnblogs.com/xiaoniuniu/p/3887380.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!