二进制优化之后可视为01背包,复杂度NVlogS
N的取值为2000*log2000,M为2010
#include<bits/stdc++.h>
using namespace std;
const int N=25010,M=2010;
int n,m;
int v[N],w[N];
int f[M];
int main(){
cin>>n>>m;
int cnt=0;
for(int i=0;i<n;i++){
int a,b,c;
cin>>a>>b>>c;
int k=1;
while(k<=c){
cnt++;
v[cnt]=k*a;
w[cnt]=k*b;
c-=k;
k<<=1;
}
if(c>0){
cnt++;
v[cnt]=c*a;
w[cnt]=c*b;
}
}
n=cnt; //记得更新n
for(int i=1;i<=n;i++){
for(int j=m;j>=v[i];j--){
f[j]=max(f[j],f[j-v[i]]+w[i]);
}
}
cout<<f[m]<<endl;
}