322 Coin Change零錢兌換問題

2021-09-14 07:26:32 字數 1372 閱讀 2014

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。

示例 1:

輸入: coins = [1, 2, 5], amount = 11

輸出: 3

解釋: 11 = 5 + 5 + 1

示例 2:

輸入: coins = [2], amount = 3

輸出: -1

解法:揹包問題,首先想最少的硬幣數,肯定是盡量取較大的硬幣,能取乙個則硬幣數加一,取當前硬幣的個數等於之前硬幣個數加上當前這個硬幣(也就是加1),但前提是之前硬幣總價值加上當前這個硬幣的價值不能超過總個數,因此是乙個動態規劃問題。

狀態轉移方程:

因此兩層迴圈,外面一層是金額,裡面一層是每個硬幣。

d p[

i]=m

in(d

p[i]

,dp[

i−co

in[j

]]+1

)dp[i]=min(dp[i],dp[i-coin[j]]+1)

dp[i]=

min(

dp[i

],dp

[i−c

oin[

j]]+

1)

class solution 

};

給定不同面額的硬幣和乙個總金額。寫出函式來計算可以湊成總金額的硬幣組合數。假設每一種面額的硬幣有無限個。

示例 1:

輸入: amount = 5, coins = [1, 2, 5]

輸出: 4

解釋: 有四種方式可以湊成總金額:

5=55=2+2+1

5=2+1+1+1

5=1+1+1+1+1

示例 2:

輸入: amount = 3, coins = [2]

輸出: 0

解釋: 只用面額2的硬幣不能湊成總金額3。

示例 3:

輸入: amount = 10, coins = [10]

輸出: 1

解題:這道題和上乙個非常相似,思想難度也不大,但是有乙個坑,就是順序問題,例如總金額4,121和112都是總金額4,但是要求是無序的,也就是說這兩個都是乙個情況,所以不能像之前那樣考慮,因為外迴圈金額內迴圈硬幣,121和112都是在最後乙個硬幣迴圈遇到的,肯定會重複,怎麼不會重複呢?外迴圈硬幣內迴圈金額就可以了,這是為啥呢?就相當於乙個硬幣乙個硬幣的加,每增加乙個硬幣就從1到amount考慮所有金額,因為硬幣是乙個乙個考慮了,所以就不會重複了。

class solution }}

return dp.back();

}};

322 零錢兌換

class solution 不是大的取的越多越好,大的取的很多,最後不能剛好取到,比如22,陣列是10,6,你直接取兩個10肯定不行第乙個數有取1個,取0個或者取多個好幾種取法。比如18,你有10和6,那麼10乙個都不能取 所以要考慮的只是當前這一位可以取幾個 for int i left coi...

322 零錢兌換

最值問題 最優子結構特性 子問題重疊特性 使用動態規劃 狀態轉移方程 列出狀態轉移方程 步驟 1.明確狀態 原問題和子問題中變化的量 amount 連續性變化 2.定義動態規劃陣列 函式的含義 dp n 的含義 湊成n需要的硬幣個數 3.明確選擇 對於每個狀態,可以做出什麼選擇來改變當前狀態 選乙個...

322 零錢兌換

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 coins 2 amount...