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