与背包恰好装满的问题很像,但是本题每种硬币的数量不限制,因此做法很不同,搞了半天,还是看答案搞懂的。就随便记录一下吧
背包的容量每次递增一个单位,对于n类的硬币,有n种情况,每种情况都是取一枚硬币,然后求剩余容量的最少硬币数。
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
dp = [0]*(amount + 1)
inf = float('inf')
for i in range(1,amount+1):
tmp = []
for j in coins:
if i >= j:
tmp.append(dp[i-j])
dp [i] = min(tmp) + 1 if len(tmp) > 0 else inf
return dp[amount] if dp[amount] != inf else -1
记忆化递归
参考自:
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
dict1 = {}
inf = float('inf')
def _dfs(amount):
if amount == 0:
return 0
if amount < 0:
return inf
if amount in dict1.keys():
return dict1[amount]
res = inf
for c in coins:
res = min(res, _dfs(amount - c) + 1)
dict1[amount] = res
return res
res = _dfs(amount)
return res if res != inf else -1