【问题标题】:Dynamic programming, minimum number of coins动态规划,最小硬币数量
【发布时间】:2018-11-05 22:00:35
【问题描述】:

我一直在研究https://runestone.academy/runestone/static/pythonds/index.html 的算法和数据结构,我学习了关于动态编程和经典的最小硬币数量问题的部分。给定一个总和,我们必须计算出将其兑换成不同面额的硬币所需的最少硬币数量。

在本书提出的解决问题的代码中,有两行代码我无法弄清楚它们的作用,即使我的生命依赖于它。

代码在这里:

def recMC(coinValueList,change):
   minCoins = change
   if change in coinValueList:
     return 1
   else:
      for i in [c for c in coinValueList if c <= change]:
         numCoins = 1 + recMC(coinValueList,change-i)
         if numCoins < minCoins:
            minCoins = numCoins
   return minCoins

print(recMC([1,5,10,25],63))

我不明白为什么我们需要这部分:

         if numCoins < minCoins:
            minCoins = numCoins
   return minCoins

我尝试用一​​条语句替换所有 3 行

   return numCoins 

它似乎工作得很好,除了change == 0。我不认为他们在书中写它的方式是为了“保护”免受输入 0 的影响,因为这可以更简单地处理。

他们为什么要这样写?

ps:如果重要的话,我会在 python3.5 上运行它...

干杯

【问题讨论】:

  • 尝试以相反的顺序传递硬币。例如 print(recMC([25, ,5,1, 10],63))
  • 感谢@chandra 的提示,它实际上给出了奇怪的结果......我现在正在尝试调试它。
  • 很抱歉,我无法想象这是如何工作的……在我看来,我们正在将苹果和橙子与 numCoins

标签: python dynamic-programming coin-change


【解决方案1】:

正如chapter中解释的那样,

如果金额不匹配,我们有多种选择。我们想要的是最小的一便士加上找零所需的硬币数量减去一便士,或一美分加上找零所需的硬币数量减去五美分,或一角硬币加原始金额减去十美分所需的硬币数量,依此类推。因此,可以根据以下公式计算原始金额所需的硬币数量:

numCoins=min(1+numCoins(originalamount−1),
             1+numCoins(originalamount−5),
             1+numCoins(originalamount−10),
             1+numCoins(originalamount−25))

for 循环中的下面一行是计算 numCoins 的每个选项。

for i in [c for c in coinValueList if c <= change]:
     numCoins = 1 + recMC(coinValueList,change-i)

循环中接下来的两行记录了 numCoins 的最小值:

if numCoins < minCoins:
        minCoins = numCoins

为了便于理解,您可以将函数重写为:

def recMC(coinValueList,change):
    if change in coinValueList:
        return 1
    else:
        return min([1 + recMC(coinValueList,change-c) for c in coinValueList if c < change])

【讨论】:

  • 非常感谢,我终于弄明白了 :) 我迷路了,因为在 minCoins 中存储 numCoins 似乎很奇怪,但实际上并不重要,因为我们传入的参数递归是改变......再次感谢。
  • 但我确实更喜欢你重写它的方式,它认为它不那么模棱两可了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2018-02-25
  • 1970-01-01
相关资源
最近更新 更多