裸多重背包二进制优化
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
ll vv[1000005],ww[1000005],mm[1000005],dp[1000005];
ll val[1000005],sizev[1000005];
int main(){
ll n,v,flag=0;
cin>>n>>v;
for(int i=0;i<n;i++){
cin>>vv[i]>>ww[i]>>mm[i];
for(int j=1;j<=mm[i];j<<=1){
val[flag]=j*vv[i];
sizev[flag++]=j*ww[i];
mm[i]-=j;
}
if(mm[i]>0){
val[flag]=mm[i]*vv[i];
sizev[flag++]=mm[i]*ww[i];
}
}
// memset(dp,0,sizeof(dp));
for(int i=0;i<flag;i++){
for(int j=v;j>=sizev[i];j--){
dp[j]=max(dp[j],dp[j-sizev[i]]+val[i]);
}
}
cout<<dp[v]<<endl;
}