Динамическое программирование, минимальное количество монет

Я изучал алгоритмы и структуры данных на 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 ответ

Как объяснено в главе,

Если сумма не совпадает, у нас есть несколько вариантов. То, что мы хотим, это минимум копейки плюс количество монет, необходимое для внесения изменений в исходную сумму минус пенни, или никель плюс количество монет, необходимых для внесения изменений в исходную сумму минус пять центов, или десять центов плюс количество монет, необходимое для внесения изменений в исходную сумму минус десять центов и т. д. Таким образом, количество монет, необходимых для внесения изменений в исходную сумму, можно рассчитать по следующей формуле:

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])
Другие вопросы по тегам