hdu 3732(01背包转多重背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3732

思路:这么大的数据,用01背包肯定会TLE的,01背包转多重背包。。最多也就11*11=121件物品。。。

View Code
 1 #include<iostream>
 2 using namespace std;
 3 int dp[10010];
 4 int map[14][14];
 5 int n,m;
 6 
 7 void CompletePack(int value,int cost){
 8     for(int j=cost;j<=m;j++){
 9         dp[j]=max(dp[j],dp[j-cost]+value);
10     }
11 }
12 
13 void ZeroOnePack(int value,int cost){
14     for(int j=m;j>=cost;j--){
15         dp[j]=max(dp[j],dp[j-cost]+value);
16     }
17 }
18 
19 
20 int main(){
21     while(~scanf("%d%d",&n,&m)){
22         char str[14];
23         int a,b;
24         memset(dp,0,sizeof(dp));
25         memset(map,0,sizeof(map));
26         for(int i=0;i<n;i++){
27             scanf("%s%d%d",str,&a,&b);
28             map[a][b]++;//转化为物品的件数
29         }
30         for(int i=0;i<=10;i++){
31             for(int j=0;j<=10;j++){
32                 if(map[i][j]*j>=m){
33                     CompletePack(i,j);//件数*花费>=总花费,完全背包
34                 }else {
35                     //0-1背包
36                     int k=1;
37                     while(k<map[i][j]){
38                         ZeroOnePack(i*k,j*k);
39                         map[i][j]-=k;
40                         k*=2;
41                     }
42                     ZeroOnePack(i*map[i][j],j*map[i][j]);
43                 }
44             }
45         }
46         printf("%d\n",dp[m]);
47     }
48     return 0;
49 }

 

posted @ 2013-04-06 21:11  ihge2k  阅读(305)  评论(0编辑  收藏  举报