动态规划问题总结
背包问题
分类
排列组合问题
\[dp[i] += dp[i - num[j]]
\]
判断问题(true or false)
\[dp[i] = dp[i] || dp[i - num[j]]
\]
最大最小问题
\[dp[i] = min(dp[i], dp[i - num[j]] + 1)
\]
或者
\[dp[i] = max(dp[i], dp[i - num[j]] + 1)
\]
判定与步骤
背包问题具备的特征:给定一个 target
,target
可以是数字也可以是字符串,再给定一个数组 nums
,nums
中装的可能是数字,也可能是字符串,问:能否使用 nums
中的元素做各种排列组合得到 target
- 分析是否为背包问题
- 是三种背包问题的哪一种
- 是0-1背包问题还是完全背包问题。也就是题目给的nums数组中的元素是否可以重复使用
- 如果是排列组合问题,是否需要考虑元素之间的顺序。排列有排列的解法,组合有组合的解法
代码模板
0-1背包
即数组中的元素不可重复使用
nums
放在外循环,target
在内循环,且内循环倒序
for num in nums:
for i in range(target, nums - 1, -1):
完全背包(组合)
即数组中的元素可重复使用
nums
放在外循环,target
在内循环,且内循环正序
for num in nums:
for i in range(nums, target + 1):
完全背包(排列)
需考虑元素之间的顺序,需将 target
放在外循环,将 nums
放在内循环
for i in range(1, target + 1):
for num in nums: