動態規劃 零錢兌換

2021-10-17 19:38:28 字數 1234 閱讀 4972

問題描述

給定不同面額的硬幣 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 ...