LeetCode動態規劃 322零錢兌換

2021-10-03 16:03:20 字數 888 閱讀 4680

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。

示例 1:

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

輸出: 3 

解釋: 11 = 5 + 5 + 1

示例 2:

輸入: coins = [2], amount = 3

輸出: -1

說明:你可以認為每種硬幣的數量是無限的。

這道題有乙個相像的題目:leetcode貪心-860檸檬水找零。對於檸檬水找零這道題,由於錢幣數額是規則的(eg:1,5,10),所以一定可以恰好找零,且可以用貪心的做法,滿足貪心選擇性質。但是這道題的錢幣數額是隨機的正整數,如果使用貪心(盡量先用大面額錢幣找零)+回溯(遇到不可恰好找零的組合方式時進行回溯)的做法,則會有如下反例:錢幣3種,6,5,1,總額22。若貪心(先盡量多用6塊進行找零)+回溯,結果為7(3*6 + 4*1),而正確結果應該為4 (2*6 + 2*5)。所以,該題不滿足貪心選擇性質,不能用貪心的做法。

一種正確的思路是dp的方式,類似揹包問題。首先,定義狀態,dp[i]表示數額i找零所需的最少錢幣數;然後,定義狀態初始值,dp[0] = 0(為0元找零只需0個錢幣);最後,尋找狀態轉移方程,dp[i] = min(dp[ i - coins[j] ] +1) for j in coins.size()。

int coinchange(vector& coins, int amount) 

}} }

if (dp[amount] == -1)

return -1;

else

return dp[amount];

}

leetcode 322 動態規劃

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1輸入 coins 2 amount 3 輸出 1說明 你...

leetcode 322 零錢兌換(動態規劃)

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 coins 2 amount...

leetcode 322 零錢兌換 動態規劃

動態規劃例題1 轉移方程 這個題目即使知道了轉移方程,最後寫出正確的程式也還是很難,有幾個細節需要注意 1.開的結果陣列大小是amount 1,這是因為我們的f x 表示拼成x最少有幾種方式,最後返回f amount 所以陣列開闢amount 1。2.初始條件f 0 0,所以遍歷f i 從i 1開始...