給定不同面額的硬幣coins
和乙個總金額amount
。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回-1
。
你可以認為每種硬幣的數量是無限的。
示例 1:
輸入:coins = [1, 2, 5], amount = 11
輸出:3
解釋:11 = 5 + 5 + 1
示例 2:
輸入:coins = [2], amount = 3
輸出:-1
示例 3:
輸入:coins = [1], amount = 0
輸出:0
示例 4:
輸入:coins = [1], amount = 1
輸出:1
示例 5:
輸入:coins = [1], amount = 2
輸出:2
public int coinchange(int coins, int amount)
private int coinchange(int idxcoin, int coins, int amount)
if (idxcoin < coins.length && amount > 0)
}} return (mincost == integer.max_value)? -1: mincost;
} return -1;
}
對於給定的輸入:coins = [1, 2, 5], amount = 11
。
陣列coins
的每個元素值表示硬幣的不同面額,amount
表示總金額。
maxval
表示某種面額的硬幣的最大數量。比如總金額為11
,對於面額為1
的硬幣,那麼maxval
就是11
,遍歷0
到11
,表示當面額為1
的硬幣數分別為0
到11
的各種情況。
當面額為1
的硬幣數為1
時,總金額變為10=11-1*1
(amount - x * coins[idxcoin]
),接著看其他面額的硬幣的情況(在遞迴呼叫時將idxcoin + 1
傳給idxcoin
)。
// ...
int maxval = amount / coins[idxcoin];
int mincost = integer.max_value;
for (int x = 0; x <= maxval; x++) }}
return (mincost == integer.max_value)? -1: mincost;
// ...
注意到mincost
是在for
迴圈外定義的,在第一次遞迴呼叫前的for
迴圈表示遍歷面額為1
的硬幣數分別為0
到11
的各種情況,所以當這個for
迴圈結束後就能求得全域性最少硬幣數mincost
。
對於給定的輸入:coins = [1, 2, 3], amount = 6
。
在遍歷不同面額的硬幣時,遞迴呼叫coinchange
。每次遞迴呼叫總金額都會減少,總金額為1
時只需要乙個面額為1
的硬幣,此時count[0]
為1
。
當總金額為2
時,同樣遍歷面額為1
、2
和3
的硬幣:遍歷面額為1
的硬幣時,硬幣數為2
(min = 1 + res
);遍歷面額為2
的硬幣時,因為res < min
(0 < 2
),所以min
為1
(min = 1 + res
)。
注意到count
陣列為[1, 1, 1, 2, 2, 2]
,count[i]
表示總金額為i+1
時的最少硬幣數(實際上還要看陣列coins
有哪些面額的硬幣)。
public int coinchange(int coins, int amount)
} }return dp[amount] > amount ? -1 : dp[amount];
}
還可以通過狀態轉移方程來做。
參考:
動態規劃 零錢兌換
問題描述 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。你可以認為每種硬幣的數量是無限的。比如coins 1,2,5 amount 11,11 5 5 1,最終結果為3 演算法思路 本...
零錢兌換(動態規劃)
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 ...