背包问题是一个非常典型的考察动态规划应用的题目,对其加上不同的限制和条件,可以衍生出诸多变种,若要全面理解动态规划,就必须对背包问题了如指掌。
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
