可以将混合背包看作是一个特殊的多重背包,只要转化一下即可,将s==-1转为1s==0转化为m/v(最大可能装下的货物);
二进制优化的精髓就在于选择物品的次数,比如有s==7,我们可以分为1,2 ,4(二进制形式),1就代表选择一个货物,2代表两个,4代表4个,那么s==10时可能会剩个3我们只需要在后边补上即可,每一次选择几个就是几个的价值(4个就是4个的价值)
#include<bits/stdc++.h>
using namespace std;
int v[100010];
int w[100010];
int f[1000010];
int cnt=1;
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
int k=1;
int a,b,s;
cin>>a>>b>>s;
if(s==-1)
{
s=1;
}
if(s==0)
{
s=m/a;
}
while(k<=s)
{
v[cnt]=a*k;
w[cnt]=b*k;
s-=k;
k*=2;
cnt++;
}
if(s>0)
{
v[cnt]=s*a;
w[cnt]=s*b;
cnt++;
}
}
for(int i=1;i<=cnt;i++)
{
for(int j=m;j>=v[i];j--)
{
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[m]<<endl;
return 0;
}