混合背包问题

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1010;
int f[N];
int n,m;
int main(){
    cin>>n>>m;
    while(n--){
        int v,w,s;
        cin>>v>>w>>s;
        if(s==0){
            for(int i=v;i<=m;i++)f[i]=max(f[i],f[i-v]+w);
        }
        else{
            if(s==-1)s=1;
            for(int k=1;k<=s;k<<=1){
                for(int i=m;i>=k*v;i--)f[i]=max(f[i],f[i-k*v]+k*w);
                s-=k;
            }
            if(s){
                for(int i=m;i>=s*v;i--)f[i]=max(f[i],f[i-s*v]+s*w);
            }    
            
        }
    }
    cout<<f[m]<<endl;
}