day44 动态规划part6 代码随想录算法训练营 518. 零钱兑换 II
题目:518. 零钱兑换 II
我的感悟:
- 递推公式,我没写错。
- 是初始化写错了。
- 这种求多少种的,要考虑1种,是空集合选1中。而那些考虑能背最大的价值,要从0初始化,0的含义值无价值。
理解难点:
- 递推公式,是累加
dp[j] += dp[j-conins[i]]
- 初始化的含义
dp[0] = 1
听课笔记:
- 补充的一点,for循环遍历顺序
- 这里先遍历物品是组合
- 如果先遍历背包,就是排列。
代码示例:
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
dp = [0] * (amount +1)
dp[0] = 1 # 种类的初始化为1,求的是集合()
for i in range(len(coins)):
for j in range(coins[i],amount+1):
dp[j] += dp[j-coins[i]] # 凑成的种类
# print(dp)
return dp[amount]
通过截图:
扩展写法:
资料:
- 零钱兑换 II
视频讲解:https://www.bilibili.com/video/BV1KM411k75j
https://programmercarl.com/0518.%E9%9B%B6%E9%92%B1%E5%85%91%E6%8D%A2II.html