多重背包(二进制优化)
二进制优化就是把对数量有限制的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 }