背包问题是一个非常典型的考察动态规划应用的题目,对其加上不同的限制和条件,可以衍生出诸多变种,若要全面理解动态规划,就必须对背包问题了如指掌。
01背包问题
题目描述
一个小偷面前有一堆(n
个)财宝,每个财宝有重量w
和价值v
两种属性,而他的背包总容量为m
,如何选取财宝,可以取得最大价值。
- 01:即限定每个物品要么拿(1个)要么不拿(0个)。
状态转移方程如下:
for w, v in n:
# 此处不能从前往后遍历背包,
# 因为从前往后的话,可能导致同一个财宝被放入背包多次
for i in range(m, w - 1, -1):
dp[i] = max(dp[i], v + dp[i - w])
leetcode 题目1
leetcode 题目2
完全背包问题
如果每个财宝可以无限选用,则该问题称为完全背包问题。
dp示例
for w, v in n:
for i in range(w, m + 1): # 注意这一行,从前往后遍历
dp[i] = max(dp[i], v + dp[i - w])
leetcode 题目
多重背包问题
如果限定财宝**i
**最多只能拿**k**
个,则问题称为有界或多重背包问题。
dp示例
for w, v in n:
for i in range(m, w - 1, -1):
for k in range(k + 1):
dp[i] = max(dp[i], k*v + dp[i - k*w])
- 尚未找到对应题目
其他思路:将问题转化为01背包问题
只需要将原数组的j
个财宝i
,扁平化处理,然后运用01背包问题的解法即可。参考地址
https://zhuanlan.zhihu.com/p/85780471?from_voters_page=true
https://www.jianshu.com/p/50af9094a2ac
https://github.com/tianyicui/pack/blob/master/V2.pdf