給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回-1。
示例 1:輸入:coins =[1, 2, 5]
, amount =11
輸出:3
解釋:11 = 5 + 5 + 1
示例 2:輸入:coins =[2]
, amount =3
輸出:-1
我們維護乙個一維動態陣列dp,其中dp[i]表示錢數為i時的最小硬幣數的找零,注意由於陣列是從0開始的,所以我們要多申請一位,陣列大小為amount+1,這樣最終結果就可以儲存在dp[amount]中了。初始化dp[0] = 0,因為目標值若為0時,就不需要硬幣了。其他值可以初始化為整型最大值,或者是amount+1,為啥呢,因為最小的硬幣是1,所以amount最多需要amount個硬幣,amount+1也就相當於整型最大值的作用了。好,接下來就是要找狀態轉移方程了,沒思路?不要緊!回歸例子1,假設我取了乙個值為5的硬幣,那麼由於目標值是11,所以是不是假如我們知道dp[6],那麼就知道了組成11的dp值了?所以我們更新dp[i]的方法就是遍歷每個硬幣,如果遍歷到的硬幣值小於i值(比如我們不能用值為5的硬幣去更新dp[3])時,我們用 dp[i - coins[j]] + 1 來更新dp[i],所以狀態轉移方程為:
dp[i] = min(dp[i], dp[i - coins[j]] + 1);
其中coins[j]為第j個硬幣,而i - coins[j]為錢數i減去其中乙個硬幣的值,剩餘的錢數在dp陣列中找到值,然後加1和當前dp陣列中的值做比較,取較小的那個更新dp陣列。
public int coinchange(int coins, int amount) }}
return (dp[amount] > amount) ? -1 : dp[amount];
}
leetcode 322 零錢兌換
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1示例 2 輸入 coins 2 amount ...
LeetCode 322 零錢兌換
322 零錢兌換 題目 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 co...
LeetCode322 零錢兌換
322.零錢兌換 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 coins...