leetcode 322 零錢兌換

2021-10-23 03:20:43 字數 1377 閱讀 3256

無限揹包問題

有n種物品和乙個容量為v的揹包,每種物品都有無限件可用,第i件物品消耗的容量為ci,價值為wi,求解放入哪些物品可以使得揹包中總價值最大。

無限揹包(完全揹包)特點:物品種類為n個(每種物品數量無限)
題目描述:給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。

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

輸出: 3

解釋: 11 = 5 + 5 + 1

解題步驟

方法一:貪心演算法。看到這類題目第一想法就是採用貪心演算法來求解。但是貪心演算法也存在不足之處:

如果我們換一組鈔票面值,比如 1, 5, 11,我們要湊出15的時候, 貪心策略就會出錯:

15 = 11 * 1 + 1 * 4 (貪心策略)

15 = 5 * 3(正確策略)

方法二:動態規劃

由於貪心演算法無法適用於所有面額的情況,我們採用動態規劃的方法來求解

1、 狀態定義:dp[i]表示湊出金額i所需要的最小硬幣數量

2、 狀態轉移方程:dp[i] = min(dp[i],dp[i-coins[i]]+1) (i >= conins[i])

conins[i]表示最後一枚硬幣的面值數,將該硬幣新增進去後,總金額數減少,並且硬幣數量增加

3、 初始化:dp[0] = 0,其他dp[i] = amount+1;

4、 輸出:dp[amount],由於最後判斷是否需要輸出-1.如果沒有任何一種硬幣組合能組成總金額,那麼dp[amount]一定不會被賦值,所以我們可以初始化乙個dp陣列為amount+1,最後再判斷dp[amount]是否改變就能判斷是否輸出-1了

**

public

intcoinchange

(int

coins,

int amount)

} system.out.

println

(arrays.

tostring

(dp));

if(dp[amount]

> amount)

return-1

;return dp[amount]

;}

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...