LC 322动态规划中等第 80 / 95 题

零钱兑换

Coin Change

动态规划完全背包
本机进度仅保存在当前浏览器

题目描述

给你一个整数数组 coins 表示不同面额的硬币,以及一个整数 amount 表示总金额。计算并返回可以凑成总金额所需的最少的硬币个数;任何硬币组合都无法凑出总金额则返回 -1。每种硬币数量无限。

示例:coins = [1, 2, 5],amount = 11,输出 3(5 + 5 + 1)。

解题思路

  1. 完全背包的"最少件数"版本:dp[x] 表示凑出金额 x 的最少硬币数,答案 dp[amount]。
  2. 转移:枚举每种硬币 c,dp[x] = min(dp[x - c] + 1),含义是"最后用一枚 c"。
  3. 初始化 dp[0] = 0、其余为正无穷表示不可达;外层枚举金额、内层枚举硬币的顺序均可(求最少件数与组合/排列无关)。

参考实现

查看参考实现Python · 建议先自行作答
def coinChange(coins, amount):
    INF = amount + 1  # 正无穷哨兵
    dp = [0] + [INF] * amount
    for x in range(1, amount + 1):
        for c in coins:
            if c <= x:
                dp[x] = min(dp[x], dp[x - c] + 1)
    return -1 if dp[amount] > amount else dp[amount]

复杂度与归属

时间复杂度O(amount × 硬币数)
空间复杂度O(amount)
所属分类动态规划
题源LeetCode 322

关联教程

返回题图鉴