统一转化为多重背包$II$再转化为01背包即可
#include<bits/stdc++.h>
using namespace std;
struct object{
int vol,wor;
};
vector<object>a;
int N,V;
int dp[1001];
int main()
{
cin>>N>>V;
for(int i=1;i<=N;i++){
int v,w,s;
cin>>v>>w>>s;
if(s==0){
s=V/v;
}else if(s==-1){
s=1;
}
for(int j=1;j<=s;j*=2){
s-=j;
a.push_back({j*v,j*w});
}
if(s>0){
a.push_back({s*v,s*w});
}
}
vector<object>::iterator it;
for(it=a.begin();it!=a.end();it++){
for(int j=V;j>=(*it).vol;j--){
dp[j]=max(dp[j],dp[j-(*it).vol]+(*it).wor);
}
}
cout<<dp[V]<<endl;
return 0;
}