leedcode518:完全揹包,零錢兌換,python逐行註解

咕嚕咕嚕day發表於2020-11-07

題目:

 

程式碼:

class Solution:
    def change(self, amount: int, coins: List[int]) -> int:
        # 比如是隻有兩個硬幣面值,並且兩個硬幣的數量是無限的,當無限取硬幣時,轉移方程:pro[n] += proi[n-coin[i]]  為什麼是+=, 因為比如你使用面值為1時的組合方案在計算使用面值為2的方案時,應該是初始值;

        # 時間複雜度:O(amount*coins_n)
        # 空間複雜度:O(amount)

        dp = [0] * (amount+1)  # 初始的金額組合方案都應該是為0,且金額包含0和amount;所以應該定義amount+1 
        dp[0] = 1    # 作為參考值使得後續轉移方程正確, 比如當使用一分面值時,dp[1] = dp[1] + dp[1-1]; 明顯amount=1時應該有一種方案,又初始dp[1]=0,所以dp[0]=1

        coins_n = len(coins)

        for i in range(coins_n): # 因為硬幣是無限數量的所以針對硬幣迴圈,揹包容量由小變大
            for j in range(coins[i], amount+1): # 因為當金額小於當前使用的面值時,不會使用
                dp[j] += dp[j-coins[i]]
        return dp[amount]

 

相關文章