一. 背包问题算法模版大全
1. 01背包问题
朴素做法
// f[i][j]表示只看前i个物品,总体积是j的情况下,总价值最大是多少
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int v[N], w[N], f[N][N];
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> v[i] >> w[i];
// 朴素
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= m; j ++) {
f[i][j] = f[i - 1][j];
if (j >= v[i]) f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
}
}
cout << f[n][m] << endl;
}
一维优化——对代码做等价变形
分析:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int v[N], w[N], f[N];
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> v[i] >> w[i];
for (int i = 1; i <= n; i++) {
for (int j = m; j >= v[i]; j--) {
// 倒序
f[j] = max(f[j], f[j - v[i]] + w[i]);
// 朴素 f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]);
}
}
cout << f[m] << endl;
}
2. 完全背包问题
完全背包问题等价表达式

这篇博客详细介绍了背包问题的五种常见类型:01背包、完全背包、多重背包、多重背包II和分组背包问题,并提供了对应的算法模板和实例解析。其中,01背包和完全背包通过等价变形进行了一维优化,多重背包问题通过二进制优化提升效率。此外,还展示了装箱问题和整数划分问题的解题思路和代码实现。
最低0.47元/天 解锁文章

422

被折叠的 条评论
为什么被折叠?



