主要内容
完全背包问题
动态规划题目
518. 零钱兑换 II
思路分析
完全背包
代码
class Solution:
# dp[j]表示凑成j的组合数
# dp[j] += dp[j - num[i]]
# dp[0] = 1
def change(self, amount: int, coins: List[int]) -> int:
dp = [0] * (amount + 1)
dp[0] = 1
for coin in coins:
for j in range(coin, amount + 1):
dp[j] += dp[j - coin]
# print(dp)
return dp[amount]
377. 组合总和 Ⅳ
思路分析
如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
如果把遍历nums(物品)放在外循环,遍历target的作为内循环的话,举一个例子:计算dp[4]的时候,结果集只有 {1,3} 这样的集合,不会有{3,1}这样的集合,因为nums遍历放在外层,3只能出现在1后面!
代码
class Solution:
# 顺序不同,也认为是不同的
def combinationSum4(self, nums: List[int], target: int) -> int:
dp = [0] * (target + 1)
dp[0] = 1
for j in range(1, target + 1): # 遍历背包
for num in nums: # 遍历物品
if j >= num:
dp[j] += dp[j - num]
# print(dp)
return dp[target]