使用滚动数组来优化题目
一般二维 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]