給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。
輸入: coins = [1, 2, 5], amount = 11
輸出: 3
解釋: 11 = 5 + 5 + 1
輸入: coins = [2], amount = 3
輸出: -1
說明:你可以認為每種硬幣的數量是無限的。
動態規劃
根據示例1分析:
硬幣面值分別為:1,2,5,總金額是11,現在假設 dp[i] 是 總金額為 i 的時候的最優解法的硬幣數;
因為有三種不同的面值,所以求11有3種方法,分別是:1+dp[10];1+dp[8];1+dp[6];
因此把求11的最優解轉換為分別以上3種解法最優的的一種,也就是硬幣數量最少的一種,即dp[11] = math.min(1+dp[10], 1+dp[8], 1+dp[6])
推導出狀態轉移方程:dp[i] = math.min( dp[i-coin]+1, dp[i-coin]+1, dp[i-coin]+1 ,……)
coin有多少種就比較多少次,coin有多少種取決於不同的硬幣面值有幾種。
對於dp[10]、dp[8]、dp[6]再按照上面的步驟分解。
/*** @param coins
* @param amount
* @return
*/var coinchange = function(coins, amount) }}
return dp[amount] === infinity ? -1 : dp[amount];
};
力扣 兌換零錢
題目 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1 通過動態規劃來進行求解 首先可以將問題拆分成相等的子問題,假設dp n 等於構成n元的最少的硬幣數,那麼dp n dp n m dp...
零錢兌換 leetcode
思路 建乙個動態陣列dp,大小為amount 1,dp裡面的值初始化為amount 1。dp i 表示總金額i最少可以用dp i 的零錢兌換,如果coins j 比i小,那麼總金額i可以由dp i conis j 再加上這枚零錢構成,dp i min dp i dp i coins j 1 如果dp...
leedcode 零錢兌換
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例1輸入 coins 1,2,5 amount 3 輸出 3 解釋 11 5 5 1示例2輸入 coins 2 amount 3 輸出 ...