题解
思路
代码
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
零钱兑换2
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
# dp[i]表示可凑成总金额i的组合数量
dp = [0] * (amount + 1)
dp[0] = 1
# 遍历每一种硬币(遍历物品)
for i in range(len(coins)):
# 遍历每一种总额(遍历背包)
for j in range(coins[i], amount + 1):
dp[j] += dp[j - coins[i]]
return dp[amount]