無限揹包問題:
有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...