python乱炖.2——0/1背包问题
学习笔记系列
问题描述
给定一个固定容量 W 的背包(约束),n件物品,每件物品的重量w[i]
和价值 v[i]
。
目标:选择哪些物品可以使得它们的总价值最大,且总重量不超过背包的最大承载重量。
“0/1” 意味每件物品要么被选中放入背包,要么不被选中,不能拿这个物品的一部分,这其实简化了问题。
问题求解(动态规划)
定义二维数组 dp[i][w]
- 其中 i 表示前 i 件物品,w 表示当前背包容量(背包的承载容量从 0 到 W)
- dp[i][w] 表示前 i 件物品中,容量为 w 的背包能够装入的最大价值
状态转移方程:
- 如果不选第 i 件物品:
dp[i][w] = dp[i-1][w]
——在当前的背包容量w下,保持原来的组合不变(这里有两种情况,1.这个物品太大了,放不进去,2.原来的组合价值更高)- 如果选第 i 件物品(w>物品大小w[i]):
dp[i][w] = max(dp[i-1][w], dp[i-1][w-w[i]] + v[i])