518 零錢兌換 II

2022-10-06 21:15:22 字數 1738 閱讀 6015

給你乙個整數陣列coins表示不同面額的硬幣,另給乙個整數amount表示總金額。

請你計算並返回可以湊成總金額的硬幣組合數。如果任何硬幣組合都無法湊出總金額,返回0

假設每一種面額的硬幣有無限個。

題目資料保證結果符合 32 位帶符號整數。

示例 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, coins = [2]

輸出:0

解釋:只用面額 2 的硬幣不能湊成總金額 3 。

示例 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陣列(略)

class

solution

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