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 }

 

你可能感兴趣的:(HDU)