322. 零錢兌換
難度中等1078
給定不同面額的硬幣coins
和乙個總金額amount
。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回-1
。
你可以認為每種硬幣的數量是無限的。
示例 1:
輸入:coins = [1, 2, 5], amount = 11
輸出:3
解釋:11 = 5 + 5 + 1
示例 2:
輸入:coins = [2], amount = 3
輸出:-1
memo[i]
有兩種實現的方式,去兩者的最小值
coins = [1, 2, 5], amount = 11則,當 i==0 時無法用硬幣組成,為 0 。當 i<0時,忽略 f(i)
f(i) 最小硬幣數量
f(0) 0 //金額為0不能由硬幣組成
f(1) 1 //f(1)=min(f(1-1),f(1-2),f(1-5))+1=1f(1)=min(f(1−1),f(1−2),f(1−5))+1=1
f(2) 1 //f(2)=min(f(2-1),f(2-2),f(2-5))+1=1f(2)=min(f(2−1),f(2−2),f(2−5))+1=1
f(3) 2 //f(3)=min(f(3-1),f(3-2),f(3-5))+1=2f(3)=min(f(3−1),f(3−2),f(3−5))+1=2
f(4) 2 //f(4)=min(f(4-1),f(4-2),f(4-5))+1=2f(4)=min(f(4−1),f(4−2),f(4−5))+1=2
… …f(11) 3 //f(11)=min(f(11-1),f(11-2),f(11-5))+1=3f(11)=min(f(11−1),f(11−2),f(11−5))+1=3
class
solution
// memo[n]的值: 表示的湊成總金額為n所需的最少的硬幣個數
int[
] memo =
newint
[amount +1]
;//給memo賦值,最多的硬幣數就是全部使用面值為1的硬幣進行換
//amont+1 是不可能達到的換取數量,,於是使用其進行填充
arrays.
fill
(memo, amount +1)
; memo[0]
=0;for
(int i =
1; i <= amount; i++)}
}return memo[amount]
==(amount +1)
?-1: memo[amount];}
}
LC322 零錢兌換
322.零錢兌換 難度中等1087 給定不同面額的硬幣coins和乙個總金額amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。你可以認為每種硬幣的數量是無限的。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋...
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.明確選擇 對於每個狀態,可以做出什麼選擇來改變當前狀態 選乙個...