給定不同面額的硬幣 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...