训练营day44|动态规划|518.零钱兑换II、377. 组合总和 Ⅳ
518.零钱兑换II
要点
- 属于完全背包的组合问题,状态方程依然是dp[j] += dp[j - coin]
- 在这里遍历顺序必须是先物品后背包,如果反过来计算的是排列数而非组合数。
代码
class Solution:
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]
return dp[amount]
377. 组合总和 Ⅳ
要点
- 相比于零钱兑换,本题要求的是排列而非组合,所以需要将背包作为外循环,物品作为内循环
- 时间复杂度: O(target * n)
代码
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
dp = [0] * (target + 1)
dp[0] = 1
for j in range(target + 1):
for num in nums:
if j >= num:
dp[j] += dp[j - num]
return dp[target]