题面
题解
对于背包问题,我们知道,每层的更新只和上一层有关系,与背包的类型无关,所以我们只需要逐个遍历,遇到什么类型的背包用什么转移方程更新即可
代码
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1100;
int n, m;
int f[N];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
int v, w, s;
cin >> v >> w >> s;
if (s == 0) {
//完全背包
for (int j = v; j <= m; j++) {
f[j] = max(f[j], f[j - v] + w);
}
} else {
if (s == -1) s = 1; //01背包看成使用1次的多重背包
int k = 1; //二进制优化多重背包
while (k <= s) {
for (int j = m; j >= k * v; j--) {
f[j] = max(f[j], f[j - k * v] + w * k);
}
s -= k;
k*=2;
}
if (s) {
for (int j = m; j >= s * v; j--) {
f[j] = max(f[j], f[j - s * v] + w * s);
}
}
}
}
cout<<f[m]<<endl;
return 0;
}