diff --git a/chapter_dynamic_programming/knapsack_problem/index.html b/chapter_dynamic_programming/knapsack_problem/index.html index 43087cd2b..319cebd3c 100644 --- a/chapter_dynamic_programming/knapsack_problem/index.html +++ b/chapter_dynamic_programming/knapsack_problem/index.html @@ -3713,11 +3713,11 @@

我们可以将 0-1 背包问题看作一个由 \(n\) 轮决策组成的过程,对于每个物体都有不放入和放入两种决策,因此该问题满足决策树模型。

该问题的目标是求解“在限定背包容量下能放入物品的最大价值”,因此较大概率是一个动态规划问题。

第一步:思考每轮的决策,定义状态,从而得到 \(dp\)

-

对于每个物品来说,不放入背包,背包容量不变;放入背包,背包容量减小。由此可得状态定义:当前物品编号 \(i\) 和剩余背包容量 \(c\) ,记为 \([i, c]\)

-

状态 \([i, c]\) 对应的子问题为:\(i\) 个物品在剩余容量为 \(c\) 的背包中的最大价值,记为 \(dp[i, c]\)

+

对于每个物品来说,不放入背包,背包容量不变;放入背包,背包容量减小。由此可得状态定义:当前物品编号 \(i\) 和背包容量 \(c\) ,记为 \([i, c]\)

+

状态 \([i, c]\) 对应的子问题为:\(i\) 个物品在容量为 \(c\) 的背包中的最大价值,记为 \(dp[i, c]\)

待求解的是 \(dp[n, cap]\) ,因此需要一个尺寸为 \((n+1) \times (cap+1)\) 的二维 \(dp\) 表。

第二步:找出最优子结构,进而推导出状态转移方程

-

当我们做出物品 \(i\) 的决策后,剩余的是前 \(i-1\) 个物品的决策,可分为以下两种情况。

+

当我们做出物品 \(i\) 的决策后,剩余的是前 \(i-1\) 个物品决策的子问题,可分为以下两种情况。