# 01 背包问题
每个物品有一定价值和容量,要么取要么不取,只能取一次
- 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。
- 第 i 件物品的体积是 vi,价值是 wi。
- 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
- 输出最大价值。
输入:
N 件物品
V 容量
v[N] 体积
w[N] 价值
1
2
3
4
5
2
3
4
5
# 算法思路
01 背包是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。
我们可以选择二维或一维解决 01 背包
# 二维解决 01 背包
表示前 种物品,体积为 能放下的最大价值
状态转换表 TODO
# 一维解决 01 背包
dp[j]
表示体积为 能放下的最大价值
代码实现
function maxValue(N, V, v, w) {
let dp = new Array(V + 1).fill(0);
for (let i = 0; i < N; i++) {
// 循环物品
for (let j = V; j >= v[i]; j--) {
// 循环体积;从大到小;
dp[j] = Math.max(dp[j], dp[j - v[i]] + w[i]);
}
}
return dp[V];
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
只用一维数组解 01 背包问题是十分必要的。我们最常使用的也是一维的方式。
# 总结
01 背包问题是最基本的背包问题,它包含了背包问题中设计状态、方程的最基本思想, 另外,别的类型的背包问题往往也可以转换成 01 背包问题求解。