問題描述:
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。你可以認為每種硬幣的數量是無限的。比如coins = [1,2,5],amount = 11,11 = 5 + 5 + 1,最終結果為3
演算法思路:
本題可以採用動態規劃思路,也可以採用貪心演算法思路,此篇文章講解動態規劃如何做。首先看下記憶搜尋的方式
可以看出在進行遞迴的時候,有很多重複的節點要進行操作,這樣會浪費很多的時間。使用陣列memo[ ] 來儲存節點的值。memo[n]表示錢幣 n 可以被換取的最少的硬幣數,不能換取就為 -1。findway 函式的目的是為了找到 amount 數量的零錢可以兌換的最少硬幣數量,返回其值 int在進行遞迴的時候,memo[n]被複製了,就不用繼續遞迴了,可以直接的呼叫。
2. 動態規劃
上面的記憶化搜尋是先從 memo[amonut-1]開始,從上到下,而動態規劃從 memo[0]開始,從下到上
class solution
// memo[n]的值: 表示的湊成總金額為n所需的最少的硬幣個數
int memo = new int[amount+1];
memo[0] = 0;
for(int i = 1; i <= amount;i++)
}memo[i] = min;
}return memo[amount] == integer.max_value ? -1 : memo[amount];}}
最重要的是下面這段**:
if(i - coins[j] >= 0 && memo[i-coins[j]] < min)
思考一下兩個問題:1)為什麼採用 i-coins[j] 和memo[i-coins[j]]進行判斷呢?
i-coins[j] 代表 當前金額減去一次面額後的金額是多少,memo[i-coins[j]]代表減去一次面額後的金額的最小兌換次數
2)為什麼要判斷memo[i-coins[j]] < min?
如果比當前金額小的金額兌換次數更多的話,則不需要重置min的值
零錢兌換(動態規劃)
leetcode 322 零錢兌換 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2...
零錢兌換 動態規劃
給定不同面額的硬幣coins和乙個總金額amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。你可以認為每種硬幣的數量是無限的。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 ...
動態規劃 零錢兌換
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。你可以認為每種硬幣的數量是無限的。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 ...