322. 零錢兌換
給定不同面額的硬幣 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
1<= coins.length <= 12
1<= coins[i] <= 231 - 1
0<= amount <= 104
classsolution
};
class請先思考如何做,再來看答案solution }}
return dp[amount]>amount ? -1
:dp[amount];}};
例如:coins[1,2,5]
amount=11
dp[11]=max=amount+1
先構造乙個dp陣列,長度是amount+1,給每個元素賦值為 最大值。這裡可以設定這個最大值為 amount+1。
再賦初值,設定dp[0]=0,表示amount為0的時候,需要的硬幣個數為零。
dp陣列解釋:
這裡的dp陣列存的就是每個金額對應的最少硬幣數。存的就是最終的解。
比如dp[6]=x,表示 總金額為6的時候,需要x個硬幣。
dp陣列是不斷往後確定下去的,直到amount位置。
看下圖,每一列的dp,當amount=x的時候,dp[x]的值就確定了下來。
比如,amount=1的時候,dp[1]就確定了,此時dp[2]、dp[3]等等還是初始的最大值,是未確定的。
amount=2的時候,dp[2]就確定了,此時dp[3]、dp[4]等等還是初始的最大值,是未確定的。
這些已經確定下來的dp值,在amount 繼續變大的時候,這些值是不會再變的。
比如amount=5, dp[1]依然是1,所以你會看到每一列的顏色不同,但是值是固定下來的。
dp[1]表示的僅僅是amount=1的時候,最小硬幣數。
一定要動手一步一步推導一下,這樣才能加深印象。否則,今天看懂了,過了2天,又忘記怎麼寫了。
手動一步一步推導,深入到細節,理解會更深刻。
分析步驟如下:
初始值,amount = 0:
dp[0] = 0,表示 總金額為0的時候,需要0個硬幣。
牢記狀態轉移方程: dp[i] = min(dp[i], dp[i-coins[j]]+1); //核心的狀態轉移方程
我們一步一步來 推導、分析:
amount=1
dp[1] 為 max
for迴圈遍歷coins硬幣陣列
dp[1 - 1] =dp[0]=0
根據狀態轉移方程,dp[1] = 1
amount=2
dp[2]為 max
for迴圈遍歷coins硬幣陣列
dp[2-1] = dp[1] = 1
dp[2 -2] =dp[0] =0
根據狀態轉移方程,dp[2] = 1
amount=3
dp[3]為 max
for迴圈遍歷coins硬幣陣列
dp[3-1] = dp[2] = 1
dp[3 -2] =dp[1] =1
根據狀態轉移方程,dp[3] = 2
amount=4
dp[4]為 max
for迴圈遍歷coins硬幣陣列
dp[4-1] = dp[3] = 3
dp[4 -2] =dp[2] =1
根據狀態轉移方程,dp[4] = 2 (很多人以為這裡會是3哦,其實是2)
amount=5
dp[5]為 max
for迴圈遍歷coins硬幣陣列
dp[5-1] = dp[4] = 2
dp[5 -2] = dp[3] = 2
dp[5-5] = dp[0] = 0
根據狀態轉移方程,dp[5] = 1
amount=6
dp[6]為 max
for迴圈遍歷coins硬幣陣列
dp[6-1] = dp[5] = 1
dp[6 -2] = dp[4] = 2
dp[6-5] = dp[1] = 1
根據狀態轉移方程,dp[6] = 2
amount=7
dp[7]為 max
for迴圈遍歷coins硬幣陣列
dp[7-1] = dp[6] = 2
dp[7 -2] = dp[5] = 1
dp[7-5] = dp[2] = 1
根據狀態轉移方程,dp[7] = 2
amount=8
dp[8]為 max
for迴圈遍歷coins硬幣陣列
dp[8-1] = dp[7] = 2
dp[8 -2] = dp[6] = 2
dp[8-5] = dp[3] = 2
根據狀態轉移方程,dp[8] = 3
amount=9
dp[9]為 max
for迴圈遍歷coins硬幣陣列
dp[9-1] = dp[8] = 3
dp[9 -2] = dp[7] = 2
dp[9-5] = dp[4] = 2
根據狀態轉移方程,dp[9] = 3
amount=10
dp[10]為 max
for迴圈遍歷coins硬幣陣列
dp[10-1] = dp[9] = 3
dp[10 -2] = dp[8] = 3
dp[10-5] = dp[5] = 1
根據狀態轉移方程,dp[10] = 2
amount=11
dp[11]為 max
for迴圈遍歷coins硬幣陣列
dp[11- 1] = dp[10] = 2
dp[11 -2] = dp[9] = 3
dp[11 - 5] = dp[6] = 2
根據狀態轉移方程,dp[11] = 3
leetcode322 零錢兌換
給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11輸出 3解釋 11 5 5 1 示例 2 輸入 coins 2 amount 3...
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...