Day 40 动态规划 part06

Day 40 动态规划 part06

  • 解题理解
    • 518
    • 377

2道题目
518. 零钱兑换 II
377. 组合总和 Ⅳ

解题理解

518

本题是一道完全背包问题,且求的是所有组合个数,不要求排列顺序,所以设dp[j]为凑成总金额j的货币组合数,同时是装满背包问题,递推公式为dp[j] += dp[j - coins[i]]

class Solution:  
    def change(self, amount: int, coins: List[int]) -> int:
        n = len(coins)
        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

本题跟上一题的区别在于,本题求的是排列,对顺序有要求,所以背包要放在外层for循环,才能保证相同元素顺序不同地组合成target

class Solution:
    def combinationSum4(self, nums: List[int], target: int) -> int:
        dp = [0] * (target + 1)
        dp[0] = 1
        for i in range(1, target + 1):
            for num in nums:
                if i - num >= 0:
                    dp[i] += dp[i - num]
        return dp[target]

你可能感兴趣的:(动态规划,算法)