Skip to main content

零钱兑换

Tips

题目类型: Dynamic Programming

相关题目:

题目

给定不同面额的硬币 coins 和一个总金额 amount. 编写一个函数来计算可以凑成总金额所需的最少的硬币个数. 如果没有任何一种硬币组合能组成总金额, 返回 -1. 你可以认为每种硬币的数量是无限的.

示例

输入: coins = [1, 2, 5], amount = 11

输出: 3

解释: 1 + 5 + 5 = 11

题解

DP 就是"自底而上"的解法了, dp[i] = x 表示: 当目标金额为 i 时, 至少需要 x 枚硬币. 值得注意的是, 题解将 dp 的每个元素初始化成 amount + 1, 这是因为硬币最小的面额是 1, 因此结果最多也就是需要 amount 个硬币, 因此可以使用 amount + 1 来代替 Number.MAX_SAFE_INTEGER, 此时的时间复杂度为 O(k * n).

322-coin-change

var coinChange = function (coins, amount) {
const n = amount + 1
const dp = new Array(n).fill(n)
dp[0] = 0

for (const coin of coins) {
for (let i = coin; i < n; i++) {
dp[i] = Math.min(dp[i], dp[i - coin] + 1)
}
}

return dp[amount] === n ? -1 : dp[amount]
}