【leetcode】322. 零钱兑换

58 阅读1分钟

leetcode-322.png

动态规划

这个问题可以通过 动态规划 来解决。我们定义 dp[i] 表示凑成金额 i 所需的最少硬币数,目标是找到 dp[amount]

  • 初始状态:dp[0] = 0,即凑成金额 0 需要 0 个硬币。
  • 状态转移方程:
// 其中,`coin` 是硬币面值,`i - coin` 表示当前金额减去该硬币后所剩的金额。
dp[i] = Math.min(dp[i], dp[i - coin] + 1)
var coinChange = function (coins, amount) {
    // 常规dp操作,数组大小是 n + 1
    let dp = new Array(amount + 1).fill(Infinity)
    dp[0] = 0
    for (let i = 1; i <= amount; ++i) {
        // 遍历所有可能的硬币
        for (let coin of coins) {
            // 当前金额大于 coin 才需要进入计算
            if (i >= coin) {
                dp[i] = Math.min(dp[i], dp[i - coin] + 1)
            }
        }
    }
    return dp[amount] === Infinity ? -1 : dp[amount]
};