01背包问题,求体积恰好等于m时的最大价值
需要对 f 数组作特殊的初始化,详见代码注释。
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1010;
int n, m;
int v[N], w[N];
int f[N][N];
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> v[i] >> w[i];
/* 当求体积正好等于 m 时的最大价值时,需要如下的初始化 */
// 1. 所有方案的价值都置为负无穷
memset(f, 0xf0, sizeof(f));
// 2. 只有当前体积为 0 时,对于所有物品 i,都有一种合法方案,就是
// 什么也不选,对应此时的最大价值为0.
// 3. 最后的答案还是 f[n][m]
for (int i = 0; i <= n; i++) f[i][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; 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;
return 0;
}
算法1
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla