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 }