給你乙個整數陣列coins
表示不同面額的硬幣,另給乙個整數amount
表示總金額。
請你計算並返回可以湊成總金額的硬幣組合數。如果任何硬幣組合都無法湊出總金額,返回0
。
假設每一種面額的硬幣有無限個。
題目資料保證結果符合 32 位帶符號整數。
示例 1:
輸入:amount = 5, coins = [1, 2, 5]示例 2:輸出:4
解釋:有四種方式可以湊成總金額:
5=55=2+2+1
5=2+1+1+1
5=1+1+1+1+1
輸入:amount = 3, coins = [2]示例 3:輸出:0
解釋:只用面額 2 的硬幣不能湊成總金額 3 。
輸入:amount = 10, coins = [10]輸出:1
題目中說「假設每一種面額的硬幣有無限個。 」,通過這一句話可以判斷這是一道完全揹包問題。
但本題要求的是湊成總金額數有幾種方法,而不是求能得到的最大金額數。
而且本題不強調元素之間的順序,屬於組合問題,排列問題是強調元素之間的順序的。
運用動態規劃五部曲解決問題:
確定dp陣列以及其下標的含義
dp[j]
表示湊成金額數為j的貨幣組合有多少種
確定遞推公式
不考慮coins[i]
的情況下,湊成金額數為j - coins[i]
的貨幣組合方法有dp[j - coins[i]]
種。
也就是當前湊成金額數為j
的方法數 = 之前湊成金額數為j
的方法數 + 之前湊成金額數為j - nums[i]
的方法數
。於是得到遞推公式為:dp[j] = dp[j] + dp[j - coins[i]]
dp陣列的初始化
用0個貨幣湊成金額數為0的方法有一種。
所以dp[0] = 1
下標非0的dp[j]
初始化為0,這樣累計加dp[j - coins[i]]
的時候才不會影響真正的dp[j]
確定遍歷順序
在純完全揹包問題
中,先遍歷物品還是先遍歷揹包都可以。但本題是組合問題,並不關心硬幣使用的順序,而是硬幣有沒有被用到,所以本題必須先遍歷物品。如果是排列問題,即有順序地進行排列,那就需要先遍歷揹包了 。
總結:舉例推導dp陣列(略)
classsolution
}return
dp[amount];
}};
/** * @param amount
* @param coins
* @return */
var change =function(amount, coins)
}return
dp[amount];
};
518 零錢兌換 II
給定不同面額的硬幣和乙個總金額。寫出函式來計算可以湊成總金額的硬幣組合數。假設每一種面額的硬幣有無限個。示例 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,...
LeetCode518 零錢兌換 II
題目 給定不同面額的硬幣和乙個總金額。寫出函式來計算可以湊成總金額的硬幣組合數。假設每一種面額的硬幣有無限個。示例 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 輸入 amoun...
LeetCode 518 零錢兌換 II
題目描述 給定不同面額的硬幣和乙個總金額。寫出函式來計算可以湊成總金額的硬幣組合數。假設每一種面額的硬幣有無限個。示例 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 輸入 am...