题解
思路
代码
class Solution:
### 0124 递归(1104 ms,50.2 MB)
def coinChange(self, coins: List[int], amount: int) -> int:
# 注意:需要增加lru_cache装饰器,实现记忆化缓存
@functools.lru_cache(amount)
def dfs(remain):
if remain < 0: return -1
elif remain == 0: return 0
# 每次初始化所需的最少硬币数为硬币最大数量
mini = int(1e9)
for coin in coins:
res = dfs(remain - coin)
# 只有当去掉当前coin时的最小硬币数
# 比不去掉当前coin时所需要的硬币更少,才更新mini
if 0 <= res < mini:
mini = res + 1
return mini if mini < int(1e9) else -1
if amount == 0: return 0
return dfs(amount)
### 0124 递归(1144 ms,15.2 MB)
def coinChange(self, coins: List[int], amount: int) -> int:
# dp[i]表示总额为i时所需的最少硬币数量
# 且初始化总额为0时所需硬币也为0
dp = [float('+inf')] * (amount + 1)
dp[0] = 0
# 遍历每一种硬币
for coin in coins:
# 遍历每一种总额
for i in range(coin, amount + 1):
dp[i] = min(dp[i], dp[i - coin] + 1)
return dp[amount] if dp[amount] != float('+inf') else -1