📅  最后修改于: 2023-12-03 15:28:52.431000             🧑  作者: Mango
零钱问题指的是给定不同面额的硬币和一个总金额,计算凑成总金额所需的最少的硬币个数。例如,假设我们有面额为{1, 2, 5, 10}的硬币,需要凑成总金额为12元,那么最少需要10元和两个1元的硬币,即3个硬币。
零钱问题可以使用动态规划(Dynamic Programming)来解决,具体来说,可以使用一个一维数组 dp 来表示凑成金额 i 需要的最少硬币个数。采用的思路是:
下面是使用 Python 语言实现的代码片段:
def coinChange(coins: List[int], amount: int) -> int:
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
使用动态规划解决零钱问题的时间复杂度为 O(amount * len(coins)),其中 amount 是总金额,len(coins) 是硬币数组的长度。
使用动态规划解决零钱问题的空间复杂度为 O(amount),即需要一个一维数组来存储中间状态。
零钱问题是一个动态规划的经典问题,也是算法面试中经常出现的问题。掌握动态规划的思想,可以帮助我们更好地解决类似的问题。