零錢兌換
給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。
示例 1:
輸入: coins = [1, 2, 5], amount = 11
輸出: 3
解釋: 11 = 5 + 5 + 1
示例 2:
輸入: coins = [2], amount = 3
輸出: -1
說明:
你可以認爲每種硬幣的數量是無限的。
從1開始,找到每個金額最少的硬幣組合,進行累加至要求的總金額。
/**
* @param {number[]} coins
* @param {number} amount
* @return {number}
*/
var coinChange = function(coins, amount) {
if (amount === 0) {
return 0;
}
const dp =new Array(amount + 1).fill(Number.MAX_VALUE) // 給每一個添加一個初始值,下標從0開始,到amount-1,所以要加1
dp[0] = 0; // 重新賦值
for (let i = 1; i < dp.length; i++) { // 一直循環到最後一個(要求的總金額)
for (let j = 0; j < coins.length; j++) { // 遍歷硬幣金額大小
if (i - coins[j] >= 0) { // 當前的總金額不小於硬幣金額大小
dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[dp.length - 1] === Number.MAX_VALUE ? -1 : dp[dp.length - 1];
};