# 给定不同面额的硬币 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] <= 231 - 1 # 0 <= amount <= 104 # # Related Topics 动态规划 # 👍 967 👎 0# leetcode submit region begin(Prohibit modification and deletion)class Solution(object): def __init__(self): self.cache = dict() def coinChange(self, coins, amount): """ :type coins: List[int] :type amount: int :rtype: int """ # base case if amount == 0: return 0 if amount < 0: return -1 # 缓存 if amount in self.cache: return self.cache[amount] res = float("inf") for coin in coins: pre = self.coinChange(coins, amount - coin) self.cache[amount - coin] = pre if pre == -1: continue res = min(res, 1 + pre) return -1 if res == float("inf") else res# leetcode submit region end(Prohibit modification and deletion)print(Solution().coinChange([11, 12], 25))
自底向上(推荐)
# leetcode submit region begin(Prohibit modification and deletion)class Solution(object): def __init__(self): self.cache = dict() def coinChange(self, coins, amount): """ :type coins: List[int] :type amount: int :rtype: int """ dp = [float("inf") for x in range(amount + 1)] dp[0] = 0 for i in range(amount + 1): for coin in coins: if i < coin: continue dp[i] = min(dp[i], 1 + dp[i - coin]) return dp[amount] if dp[amount] != float("inf") else -1# leetcode submit region end(Prohibit modification and deletion)print(Solution().coinChange([11, 12], 2000002))