零錢兌換 動態規劃

2022-07-11 00:30:15 字數 3307 閱讀 2726

給定不同面額的硬幣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,遍歷011,表示當面額為1的硬幣數分別為011的各種情況。

當面額為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的硬幣數分別為011的各種情況,所以當這個for迴圈結束後就能求得全域性最少硬幣數mincost

對於給定的輸入:coins = [1, 2, 3], amount = 6

在遍歷不同面額的硬幣時,遞迴呼叫coinchange。每次遞迴呼叫總金額都會減少,總金額為1時只需要乙個面額為1的硬幣,此時count[0]1

當總金額為2時,同樣遍歷面額為123的硬幣:遍歷面額為1的硬幣時,硬幣數為2(min = 1 + res);遍歷面額為2的硬幣時,因為res < min(0 < 2),所以min1(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 ...