给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。

计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1

你可以认为每种硬币的数量是无限的。

示例 1:

输入:coins = [1, 2, 5], amount = 11
输出:3
解释:11 = 5 + 5 + 1

示例 2:

输入:coins = [2], amount = 3
输出:-1

示例 3:

输入:coins = [1], amount = 0
输出:0

示例 4:

输入:coins = [1], amount = 1
输出:1

示例 5:

输入:coins = [1], amount = 2
输出:2

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 2^31 – 1
  • 0 <= amount <= 10^4

1.dfs超时
Python:

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        max_num = float('inf')

        def backtrace(coins, amount, i, num):
            nonlocal max_num
            if amount > 0 and i < 0:
                return 
            elif amount == 0 and i >= -1:
                if num < max_num:
                    max_num = num
                return 
            else:
                if num > max_num:
                    return
                for j in range(amount//coins[i], -1, -1):
                    if num+j >= max_num:
                        continue
                    backtrace(coins, amount-j*coins[i], i-1, num+j)

        backtrace(coins, amount, len(coins)-1, 0)
        return max_num if max_num != float('inf') else -1

2.动态规划
Python:

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dp = [-1 for i in range(amount+1)]
        dp[0] = 0
        for i in range(1, amount+1):
            temp = [dp[i-j] for j in coins if i-j >= 0 and dp[i-j] != -1]
            if temp:
                dp[i] = min(temp) + 1
        return dp[-1]
最后修改日期: 2021年9月17日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。