0-1背包问题一维数组模拟

没错,如果背包的容量不够放下某个物品 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 = 5j = 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 = 5j = 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 = 5j = 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 的情况下,可以选择将其放入背包,如果同时能放下物品 AB,最大价值可以达到 7

如果某个容量 j 小于物品 i 的重量,则该物品 i 无法放入背包,dp[j] 不会更新,这就是为什么我们要判断 j >= weight[i] 的原因。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值