如果是一般方法是把n的物品切为n个1份,这样要超时,以二进制的形式切可以优化,多的部分提出来即可。
#include<bits/stdc++.h>
using namespace std;
const int N=2010;
int f[N];
struct Good{
int v,w;
};
int main(){
int n,V;
cin>>n>>V;
vector<Good>goods;
for(int i=0;i<n;i++){
int v,w,s;
cin>>v>>w>>s;
for(int k=1;k<=s;k*=2){
s-=k;
goods.push_back({v*k,w*k});
}
if(s>0)goods.push_back({v*s,w*s});
}
for(auto good:goods){
for(int j=V;j>=good.v;j--){//自己写的时候忘了=号
f[j]=max(f[j],f[j-good.v]+good.w);
}
}
cout<<f[V]<<endl;
return 0;
}