动态编程,最少数量的硬币

时间:2018-11-05 22:00:35

标签: python dynamic-programming coin-change

我一直在研究https://runestone.academy/runestone/static/pythonds/index.html之外的算法和数据结构,并且深入探讨了动态编程和经典的最小硬币数目问题。给定一个总和,我们必须找出将各种面额的硬币转换成硬币所需的最小硬币数量。

本书提出的解决问题的代码中有2行即使我的生活依赖它也无法确定其角色。

代码在这里:

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上运行它...

欢呼

1 个答案:

答案 0 :(得分:0)

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])