1.Leetcode地址:322. 零钱兑换 - 力扣(LeetCode) (leetcode-cn.com)
def coinChange(self, coins, amount):
"""
:type coins: List[int]
:type amount: int
:rtype: int
"""
dp=[amount+1 for _ in range(amount+1)]
dp[0]=0
for i in range(amount+1):
for coin in coins:
if i-coin>=0:
#if dp[i-coin]==-1:continue
dp[i]=min(dp[i],dp[i-coin]+1)
#dp[i]=-1 if dp[i]==amount+1 else dp[i]
return -1 if dp[amount]==amount+1 else dp[amount]
2.518. 零钱兑换 II - 力扣(LeetCode) (leetcode-cn.com)
是一个背包问题,并不需要记录所有的解,存在关系:
dp[i]+=dp[i-coin]
需要注意的是,这里的解是无顺序的,给硬币找可以解的amount,所以这里循环顺序是coin在外层,而amount在内层,如果反过来,那么就记录了顺序。
代码如下。
class Solution(object):
def change(self, amount, coins):
"""
:type amount: int
:type coins: List[int]
:rtype: int
"""
dp=[0 for _ in range(amount+1)]
dp[0]=1
for coin in coins:
for j in range(coin,amount+1):
dp[j]+=dp[j-coin]
return dp[amount]