没错,如果背包的容量不够放下某个物品 i
,这个物品就会被跳过。在这种情况下,dp[j]
不会被更新,因为我们无法把物品 i
放入背包。
举个例子说明:
假设我们有如下的物品和背包容量:
- 物品
A
:重量2
,价值3
- 物品
B
:重量4
,价值5
- 物品
C
:重量3
,价值4
- 背包最大容量
bagWeight = 5
我们用 dp[j]
表示当背包容量为 j
时,能获得的最大价值。初始化时,dp
数组的所有元素为 0
,表示在没有放入任何物品时,价值为 0
。
遍历物品 A
(重量 2
, 价值 3
):
遍历背包容量,从 j = 5
到 j = 2
,更新 dp
数组:
- 当
j = 5
时,dp[5] = max(dp[5], dp[5 - 2] + 3)
,dp[5] = max(0, 0 + 3) = 3
- 当
j = 4
时,dp[4] = max(dp[4], dp[4 - 2] + 3)
,dp[4] = max(0, 0 + 3) = 3
- 当
j = 3
时,dp[3] = max(dp[3], dp[3 - 2] + 3)
,dp[3] = max(0, 0 + 3) = 3
- 当
j = 2
时,dp[2] = max(dp[2], dp[2 - 2] + 3)
,dp[2] = max(0, 0 + 3) = 3
此时 dp
数组变为 [0, 0, 3, 3, 3, 3]
。
遍历物品 B
(重量 4
, 价值 5
):
遍历背包容量,从 j = 5
到 j = 4
,更新 dp
数组:
- 当
j = 5
时,dp[5] = max(dp[5], dp[5 - 4] + 5)
,dp[5] = max(3, 0 + 5) = 5
- 当
j = 4
时,dp[4] = max(dp[4], dp[4 - 4] + 5)
,dp[4] = max(3, 0 + 5) = 5
此时 dp
数组变为 [0, 0, 3, 3, 5, 5]
。
遍历物品 C
(重量 3
, 价值 4
):
遍历背包容量,从 j = 5
到 j = 3
,更新 dp
数组:
- 当
j = 5
时,dp[5] = max(dp[5], dp[5 - 3] + 4)
,dp[5] = max(5, 3 + 4) = 7
- 当
j = 4
时,dp[4] = max(dp[4], dp[4 - 3] + 4)
,dp[4] = max(5, 0 + 4) = 5
- 当
j = 3
时,dp[3] = max(dp[3], dp[3 - 3] + 4)
,dp[3] = max(3, 0 + 4) = 4
此时 dp
数组变为 [0, 0, 3, 4, 5, 7]
。
总结:
- 对于物品
A
,在容量大于等于2
的情况下,我们可以选择将其放入背包,最大价值变为3
。 - 对于物品
B
,在容量大于等于4
的情况下,可以选择将其放入背包,将最大价值提升到5
。 - 对于物品
C
,在容量大于等于3
的情况下,可以选择将其放入背包,如果同时能放下物品A
或B
,最大价值可以达到7
。
如果某个容量 j
小于物品 i
的重量,则该物品 i
无法放入背包,dp[j]
不会更新,这就是为什么我们要判断 j >= weight[i]
的原因。