
可以将混合背包看作是一个特殊的多重背包,只要转化一下即可,将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;
}



















