模板题
二进制优化版
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int N = 7e3 + 10;
int v[N],w[N];
int f[N];
int n,m;
int cnt;
int main(){
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++){
int vv, ww, s;
scanf("%d%d%d",&vv,&ww,&s);
int k = 1;
while(k <= s){
cnt++;
v[cnt] = vv*k;
w[cnt] = ww*k;
s -= k;
k *= 2;
}
if(s > 0){
cnt++;
v[cnt] = vv*s;
w[cnt] = ww*s;
}
}
for(int i = 1; i <= cnt; i++){
for(int j = m; j >= v[i]; j--){
f[j] = max(f[j], f[j - v[i]] + w[i]);
}
}
cout << f[m] << endl;
return 0;
}
朴素版
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <cmath>
#include <map>
using namespace std;
const int N = 6e3 + 10;
int f[N];
int v[N],w[N],s[N];
int n,m;
int main(){
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++){
cin >> v[i] >> w[i] >> s[i];
}
for(int i = 1; i <= n; i++){
for(int j = m; j >= v[i]; j--){
for(int k = 0; k <= s[i] && v[i] * k <= j; k++){
f[j] = max(f[j], f[j - v[i]*k] + k * w[i]);
}
}
}
cout << f[m] << endl;
return 0;
}