多重背包(二进制优化)

二进制优化就是把对数量有限制的m个物品分成2^1+2^2+2^3.....2^n<=m   这样m内所有的数字就都可以组合出来了。

 1 /*
 2 二进制优化   多重背包(每个物品数量有限)   
 3 */ 
 4 #include<iostream>
 5 #include<algorithm> 
 6 #include<cstdio>
 7 using namespace std;
 8 int v[100001],w[100001],s[100001];
 9 int f[200001],i,j,n,m,n1;
10 int x,y,ss,t;
11 int main()
12 {
13     cin>>n>>m;
14     for(i=1;i<=n;i++)
15     {
16         t=1;
17         cin>>x>>y>>ss;
18         if(ss==-1||ss==1)
19         {
20             v[++n1]=x;
21             w[n1]=y;
22             s[n1]=ss;
23         }
24         else
25         {
26             while(ss>=t)
27             {///!!!! 二进制
28                 v[++n1]=x*t;
29                 w[n1]=y*t;
30                 ss-=t; 
31                 s[n1]=ss;
32                 t*=2;
33             }
34             v[++n1]=x*ss;
35             w[n1]=y*ss;
36             s[n1]=ss;
37         }
38     }
39     
40     for(i=1;i<=n1;i++)
41     {
42         if(s[i]==-1)
43         {
44             for(j=v[i];j<=m;j++) //无限++++++ 
45             f[j]=max(f[j],f[j-v[i]]+w[i]);
46         }
47         else
48         {
49             for(j=m;j>=v[i];j--)// 
50             f[j]=max(f[j],f[j-v[i]]+w[i]);
51         }
52     }
53     cout<<f[m]<<endl;
54     return 0;
55  } 

 

posted on 2016-03-17 20:09  babyyang  阅读(534)  评论(0编辑  收藏  举报