LC322 零錢兌換

2021-10-20 17:07:48 字數 1493 閱讀 6861

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.明確選擇 對於每個狀態,可以做出什麼選擇來改變當前狀態 選乙個...