成仙之路−> 算法基础课题解
二进制优化思路:
1. 将每种物品件数按二进制优化,例:1 + 2 + 4 + ... + 2 ^ k + c = s
2. 一种物品最多拆分为 11 件,最多 1000 种物品,故最多有 11000 件物品
3. 如此即可转换为 01 背包求解
完整代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2010;
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;
for (int k = 1; k <= s; k *= 2) {
for (int j = m; j >= k * v; j--)
f[j] = max(f[j], f[j - k * v] + k * w);
s -= k;
}
if (s) {
for (int j = m; j >= s * v; j--)
f[j] = max(f[j], f[j - s * v] + s * w);
}
}
cout << f[m] << endl;
return 0;
}