动态规划
这个问题可以通过 动态规划 来解决。我们定义 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]
};