C++ 代码(不能用无穷背包的那个递推公式,因为个数有限,所以k避免不了;)
所以整个过程是f[j]依靠上一层的从左到右的数,所以要逆序
#include<iostream>
#include<vector>
using namespace std;
int N,V;
int main(){
cin>>N>>V;
int v,w,s;
// vector<vector<int>> f(N+1,vector<int>(V+1,0));
vector<int> f(V+1,0);
for(int i=1;i<=N;i++){
cin>>v>>w>>s;
for(int j=V;j>=v;j--){
for(int k=0;k<=s&&k*v<=j;k++){
f[j]=max(f[j-k*v]+w*k,f[j]);
}
}
}
cout<<f[V];
return 0;
}