-
题目:现在有四个物品,背包容量为8,背包最多能装入价值为多少的物品?
物品编号 物品体积 物品体积 1 2 3 2 3 4 3 4 5 4 5 6 -
解法归纳
- 如果装不下当前物品,那么前n个物品的最佳组合和前n-1个物品的最佳组合是一样的
- 如果装得下当前物品
- 情况一:装当前物品,在给当前物品预留了相应空间的情况下,前n-1个物品的最佳组合加上当前物品的价值就是总价值
- 情况二:不装当前物品,那么前n个物品的最佳组合和前n-1个物品的最佳组合是一样的
- 选取一和二中较大的价值,为当前最佳组合的价值
-
结合实际情况分析
- 表格详解
- 表的含义:a[1][1]的值表示背包容量为1,只考虑编号0,1的物品时,背包所能装入的最大价值
- 既然是动态规划,一定有初值,a[0][j]=0、a[i][0]=0,即第一行和第一列都是0
- 根据初值推后面的值。首先判断当前行所对应的物品能否装入背包
- 如果不能装入背包,那么前i个物品与前i-1个物品在j的背包容量下,背包所能装入的最大价值相同
- 如果能装入背包
- 装当前物品i,在给i预留了对应的容量p后,前i-1个物品在j-p背包容量下的最佳组合的最大价值加上当前物品的最大价值就是总价值
- 不装当前物品i,那么前i个物品的最佳组合的最大价值与前i-1个物品时相同的
- 选择两种情况的最大值就是a[i][j]的值
- 背包内总价值最大时,背包内装了哪些物品
如果前n个物品最佳组合的价值和前n-1物品最佳组合的价值一样,说明第n个物品没有被装入。否则,第n个物品被装入。
- 背包内总价值最大为10,表示背包容量为8时,考虑前4个物品能装入的最大价值为10
- 判断是否装入4号物品:如果没有装入,那么前4个物品最佳组合与前3个物品最佳组合相同,但实际情况相反,可得4号物品被装入了背包
- 当前4号物品被装入了背包,那么需要为4号物品预留相应容量,剩余容量为3。回溯可以看到当背包为3时,前3个物品最佳组合的最大价值为4
- 判断是否装入3号物品:前3个物品最佳组合和前2个物品最佳组合的最大价值相同,可以推出3号物品为被装入背包
- 判断是否装入2号物品:背包容量为3时,前2个组合最佳组合和前1个物品最佳组合的最大值不同,对比得出2号物品被装入背包
- 当前背包容量3减去2号物品体积3,剩余背包容量为0。往回推,背包容量为0时,前1个物品最佳组合的最大价值为0
- 判断是否装入1号物品:背包容量为0时,前1个物品最佳组合和前0个物品最佳组合相同,故1号物品未被加入背包
- 回溯至0号物品时,算法结束~得出结论:背包总价值最大时,装了2号和4号物品
- 表格详解
-
背包公式
//背包公式: if (j < w[i]) { dp[i][j] = dp[i-1][j] } else { dp[i][j] = max(dp[i-1][j], dp[i-1][j-w[i]] + c[i]) }