📌  相关文章
📜  购买最低数量的零钱,并给予硬币(1)

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

零钱购买程序

简介

本程序是基于动态规划算法实现的,用于计算购买指定金额所需的最小硬币数量及硬币组合方案。

使用方法
函数签名
def change(coins: List[int], amount: int) -> Tuple[int, List[int]]:
  pass
参数说明
  • coins:硬币面值列表,例如 [1, 2, 5] 表示有三种硬币,面值分别为 1、2、5。
  • amount:需要购买的金额,例如 11 表示需要购买总金额为 11 元的商品。
返回值说明
  • 返回值为一个元组,第一个元素为最小硬币数量,第二个元素为硬币组合方案。
示例代码
from typing import List, Tuple

def change(coins: List[int], amount: int) -> Tuple[int, List[int]]:
  """
  计算购买指定金额所需的最小硬币数量及硬币组合方案
  """
  n = len(coins)
  dp = [[0] * (amount + 1) for _ in range(n + 1)]

  for i in range(n + 1):
      dp[i][0] = 0

  for j in range(amount + 1):
      dp[0][j] = float("inf")

  for i in range(1, n + 1):
      for j in range(1, amount + 1):
          if j >= coins[i - 1]:
              dp[i][j] = min(dp[i - 1][j], dp[i][j - coins[i - 1]] + 1)
          else:
              dp[i][j] = dp[i - 1][j]

  if dp[n][amount] == float("inf"):
      return -1, []

  res = []
  i, j = n, amount
  while i > 0 and j > 0:
      if dp[i][j] == dp[i - 1][j]:
          i -= 1
      else:
          res.append(coins[i - 1])
          j -= coins[i - 1]
  return dp[n][amount], res
参考资料