Leetcode题解——零钱兑换

322. 零钱兑换

Leetcode题解——零钱兑换_第1张图片

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:

        cnt_list = [float("inf")] * (amount+1)
        cnt_list[0] = 0

        for coin in coins:
            for i in range(coin, amount+1):
                cnt_list[i] = min(cnt_list[i], cnt_list[i-coin] + 1)
                
        if cnt_list[-1] == float("inf"):
            return -1
        else:
            return cnt_list[-1]

518. 零钱兑换 II

Leetcode题解——零钱兑换_第2张图片

 

class Solution:
    def change(self, amount: int, coins: List[int]) -> int:
        dp = [0] * (amount + 1)
        dp[0] = 1
        
        for coin in coins:
            for x in range(coin, amount + 1):
                dp[x] += dp[x - coin]
        return dp[amount]

注:用背包问题思想来理解硬币找零系列问题

Leetcode题解——零钱兑换_第3张图片

def func_2(coins, m):
    f = [float('inf')] * (m + 1)
    f[0] = 0
    for c in coins:  # 枚举硬币总数
        for j in range(m, c-1, -1):  # 从大到小枚举金额,确保j-c >= 0.
            f[j] = min(f[j], f[j - c] + 1)
    return f[m] if f[m] != float('inf') else -1  # 如果为inf说明状态不可达,返回-1即可。

 

Leetcode题解——零钱兑换_第4张图片

class Solution:
    def coinChange(self, coins, m):
        f = [float('inf')]*(m+1)
        f[0] = 0
        for c in coins:  # 枚举硬币种数
            for j in range(c, m+1):  # 从小到大枚举金额,确保j-c >= 0.
                    f[j] = min(f[j], f[j - c] + 1)
        return f[m] if f[m] != float('inf') else -1  # 如果为inf说明状态不可达,返回-1即可。

Leetcode题解——零钱兑换_第5张图片

def func_3(coins, m, s):
    f = [float('inf')] * (m + 1)
    f[0] = 0
    for i in range(len(coins)):
        for j in range(m, coins[i]-1, -1):
            for k in range(1, s[i]+1):  # 枚举每个硬币的个数 [1, s[i]]
                if j >= k*coins[i]:  # 确保不超过金额 j
                    f[j] = min(f[j], f[j - k*coins[i]] + k)
    print(f)
    return -1 if f[m] > m else f[m]

 

 

 

 

你可能感兴趣的:(Leetcode题解——零钱兑换)