📜  零钱| DP-7(1)

📅  最后修改于: 2023-12-03 15:28:52.431000             🧑  作者: Mango

零钱问题 - DP-7

什么是零钱问题?

零钱问题指的是给定不同面额的硬币和一个总金额,计算凑成总金额所需的最少的硬币个数。例如,假设我们有面额为{1, 2, 5, 10}的硬币,需要凑成总金额为12元,那么最少需要10元和两个1元的硬币,即3个硬币。

零钱问题的解法

零钱问题可以使用动态规划(Dynamic Programming)来解决,具体来说,可以使用一个一维数组 dp 来表示凑成金额 i 需要的最少硬币个数。采用的思路是:

  • 初始化数组 dp,值均为无限大,dp[0] = 0;
  • 遍历硬币数组 coins,获取每个硬币的面值 coin;
  • 遍历金额 i,计算 dp[i] 的值,即求解 dp[i] = min(dp[i], dp[i-coin]+1);
  • 遍历结束后,dp[amount] 就是凑成总金额所需的最少硬币个数。

下面是使用 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),即需要一个一维数组来存储中间状态。

总结

零钱问题是一个动态规划的经典问题,也是算法面试中经常出现的问题。掌握动态规划的思想,可以帮助我们更好地解决类似的问题。