LeetCode: 08.11 硬幣

完全揹包問題,即資源沒有數量限制

題目

硬幣。給定數量不限的硬幣,幣值爲25分、10分、5分和1分,編寫代碼計算n分有幾種表示法。(結果可能會很大,你需要將結果模上1000000007)

解法

根據揹包九講裏面的完全揹包的遞推公式,可以簡化時間複雜度。本來完全揹包問題可以拆分爲01揹包,但是就多出一個for循環。
dp[i][j]描述了只用前i個硬幣, 能拼出錢j的方案數目。初始化的話,如果只用一分硬幣,那所有錢數只有一種方案。注意。第二維是n+1的長度,且第一位初始化爲1,因爲如果j - coin==0, 那麼用coin只有一種方案能拼出j,就是全部都用coin
dp的定義非常重要。

class Solution:
    def waysToChange(self, n: int) -> int:
        coins = [1, 5, 10, 25]
        dp = [[0] * (1+n) for _ in range(4)] # 4, n
        for i in range(n+1): # 初始化 只用1分硬幣 只有1種
            dp[0][i] = 1
        for i in range(4):
            dp[i][0] = 1
        for i in range(1, 4):
            coin = coins[i]
            for j in range(n+1):
                if j - coin >= 0:
                    dp[i][j] = dp[i][j - coin] + dp[i-1][j]
                else:
                    dp[i][j] = dp[i-1][j]
                dp[i][j] = dp[i][j] % 1000000007
        return dp[3][-1]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章