背包问题解题思路
常见的背包问题有
1、组合问题
公式: d p [ i ] + = d p [ i − n u m ] dp[i] += dp[i-num] dp[i]+=dp[i−num]
2、True、False问题
公式: d p [ i ] = d p [ i ] o r d p [ i − n u m ] dp[i] = dp[i] or dp[i-num] dp[i]=dp[i]ordp[i−num]
3、最大最小问题
公式: d p [ i ] = m i n ( d p [ i ] , d p [ i − n u m ] + 1 ) o r d p [ i ] = m a x ( d p [ i ] , d p [ i − n u m ] + 1 ) dp[i] = min(dp[i], dp[i-num]+1) or dp[i] = max(dp[i], dp[i-num]+1) dp[i]=min(dp[i],dp[i−num]+1)ordp[i]=max(dp[i],dp[i−num]+1)
解题步骤
- 分析是否为背包问题。
- 是以上三种背包问题中的哪一种。
- 是0-1背包问题还是完全背包问题。也就是题目给的
nums
数组中的元素是否可以重复使用。 - 如果是组合问题,是否需要考虑元素之间的顺序。需要考虑顺序有顺序的解法,不需要考虑顺序又有对应的解法。
背包问题的判定
背包问题具备的特征:给定一个target
,target
可以是数字也可以是字符串,再给定一个数组nums
,nums
中装的可能是数字,也可能是字符串,
问:能否使用nums
中的元素做各种排列组合得到target
。
背包问题技巧
- 如果是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:
参考链接