518. 零钱兑换 II

使用滚动数组来优化题目

一般二维 dp 的矩阵可以使用滚动数组来解决问题

DP 规划

dp[i][j]表示的是使用前i个硬币可以凑成j数目的总数.

初始条件

dp[0][0] = 1
表示使用0个硬币, 组成数目0的总数.

class Solution(object):
    def change(self, amount, coins):
        """
        :type amount: int
        :type coins: List[int]
        :rtype: int
        """
        # dp[i][j]
        # 表示使用前 i 个硬币可以凑成面额 j 的总数
        dp =  [[0]*(amount+1) for _ in range(len(coins)+1)]
        
        # 表示用空集组成空集的个数是一个
        dp[0][0] = 1
        
        # 递推公式
        # 一个一个增加硬币的数量
        for i in range(1,len(coins)+1):
            for j in range(0,amount+1):
                # 不使用 nums[i-1]
                # 因为使用已经凑成了数值 j
                dp[i][j] += dp[i-1][j]
                
                # 为什么使用等号??
                # TODO 
                # 背包算法使用优化之后的写法, 已经对于递推关系有所改变.
                if j>=coins[i-1]:
                    # 使用 nums[i-1]这个数字
                    dp[i][j] += dp[i][j-coins[i-1]]
                    
        return dp[-1][-1]
    原文作者:cptn3m0
    原文地址: https://www.jianshu.com/p/cc6cba8e5d12
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞