【多重背包 朴素版】洛谷 B2173 多重背包
题目
https://www.luogu.com.cn/problem/B2173
题解
对于 0-1 背包:第 \(i\) 种物品可以选 0, 1 件;
对于多重背包:第 \(i\) 种物品可以选 0, 1, 2, ..., \(w_i\) 件;
将多重背包转化为 0-1 背包求解:把第 \(i\) 件物品转化为 \(w_i\) 件 0-1 背包种的物品,每件物品的体积为 \(k \times u_i\),价值为 \(k \times v_i\)。
时间复杂度:\(O(nm \sum_{i=1}^{n}{w_i})\)
空间复杂度:\(O(m)\)
参考代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);cin.tie(nullptr);
int n, m, u, v, w;
cin >> n >> m;
vector<int> dp(m + 1);
for (int i = 0; i < n; ++ i) {
cin >> u >> v >> w;// 体积、价值、数量
for (int j = m; j >= u; -- j) {// 从大到小枚举剩余背包容量(必须从大到小,否则会变为完全背包)
for (int k = 1; k <= w && k * u <= j; ++ k) {// 将多重背包转化为 0-1 背包
dp[j] = max(dp[j], dp[j - k * u] + k * v);// 动态转移
}
}
}
cout << dp[m];// 输出用体积 m 的背包最多能获取的总价值
return 0;
}
浙公网安备 33010602011771号