鱼C论坛

 找回密码
 立即注册
查看: 2561|回复: 2

最少

[复制链接]
发表于 2023-10-8 15:04:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def money(ownmoney, moneylist, knownlist):
    if ownmoney in moneylist:
        knownlist[ownmoney] = 1
        return 1
    elif knownlist[ownmoney] > 0:
        return knownlist[ownmoney]
    else:
        for each in [c for c in moneylist if c <= ownmoney]:
            numbercoin = 1 + money(ownmoney - each, moneylist, knownlist)
            if knownlist[numbercoin] == 0:
                knownlist[ownmoney] = numbercoin  # 将最小硬币数存储在knownlist中
    return numbercoin


print(money(40, [1, 5, 10, 25], [0] * 61))

此时的代码也有正确的结果,但没用min_coins 储存numbercoin,这是为什么
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-8 15:05:53 | 显示全部楼层
这是因为在代码中,变量numbercoin只在循环中定义和使用,循环结束后,变量numbercoin的值不会被返回。因此,代码中的返回语句应该放在循环外部,以确保正确的结果被返回。同时,我们需要一个变量来存储最小的硬币数,这样我们才能将其存储在knownlist中。

下面是修改后的代码:

  1. def money(ownmoney, moneylist, knownlist):
  2.     if ownmoney in moneylist:
  3.         knownlist[ownmoney] = 1
  4.         return 1
  5.     elif knownlist[ownmoney] > 0:
  6.         return knownlist[ownmoney]
  7.     else:
  8.         min_coins = float('inf')  # 用于存储最小的硬币数
  9.         for each in [c for c in moneylist if c <= ownmoney]:
  10.             numbercoin = 1 + money(ownmoney - each, moneylist, knownlist)
  11.             if numbercoin < min_coins:
  12.                 min_coins = numbercoin
  13.         knownlist[ownmoney] = min_coins  # 将最小硬币数存储在knownlist中
  14.         return min_coins


  15. print(money(40, [1, 5, 10, 25], [0] * 61))
复制代码


在修改后的代码中,我们使用了变量min_coins来存储最小的硬币数。在循环中,如果找到了一个更小的硬币数,我们更新min_coins的值。最后,我们将min_coins存储在knownlist中,并返回该值作为结果。这样就能正确地计算出最小的硬币数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-8 18:05:19 | 显示全部楼层
首先,让我们分析一下你提供的代码。这段代码是一个递归函数,用于计算找零的最小硬币数量。`ownmoney` 是需要找零的金额,`moneylist` 是硬币面额的列表,`knownlist` 是一个列表,用于存储已知的找零金额的最小硬币数量。

你的问题是:为什么没有使用 `min_coins` 变量来存储 `numbercoin`,但代码仍然能够得到正确的结果?

实际上,你的代码中存在一些问题。在 `else` 语句中,你遍历了所有小于等于 `ownmoney` 的硬币面额,然后递归地调用 `money` 函数。但是,你没有比较不同硬币组合的最小硬币数量,而是直接将 `numbercoin` 的值存储在 `knownlist` 中。这可能会导致在某些情况下得到错误的结果。

为了解决这个问题,你需要使用一个变量(例如 `min_coins`)来存储当前找到的最小硬币数量,并在遍历过程中更新它。以下是修改后的代码:


  1. def money(ownmoney, moneylist, knownlist):
  2.     if ownmoney in moneylist:
  3.         knownlist[ownmoney] = 1
  4.         return 1
  5.     elif knownlist[ownmoney] > 0:
  6.         return knownlist[ownmoney]
  7.     else:
  8.         min_coins = float('inf')  # 初始化为无穷大
  9.         for each in [c for c in moneylist if c <= ownmoney]:
  10.             numbercoin = 1 + money(ownmoney - each, moneylist, knownlist)
  11.             if numbercoin < min_coins:
  12.                 min_coins = numbercoin  # 更新最小硬币数量
  13.         knownlist[ownmoney] = min_coins  # 将最小硬币数存储在knownlist中
  14.     return min_coins

  15. print(money(40, [1, 5, 10, 25], [0] * 61))

复制代码

现在,代码将正确地比较不同硬币组合的最小硬币数量,并将其存储在 `knownlist` 中。这样,你就可以得到正确的结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-24 19:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表