2017-02-04 4 views
0

Ниже приведена грубая сила решения проблемы с минимальной заменой монет. Требуется изменение int, которое требуется для изменения, и массив монетных деноминаций. Он возвращает минимальные монеты, необходимые для внесения этих изменений.Разделите и покорите - Минимальные монеты - Монеты возврата в качестве массива

Как я могу изменить это, чтобы вернуть массив монет?

Например, если требуется внести изменение на 10 центов со значениями [1, 2, 5], он должен вернуть 2 монеты min и массив [0, 0, 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)) 
+0

Для меня это похоже на задачу с какого-нибудь веб-сайта для решения проблем ([пример] (https://www.codewars.com/kata/knapsack-part-1-the-greedy-solution)), ожидаете ли вы нам написать код для вас? Что вы пробовали? – MaLiN2223

ответ

1

Как и любой рекурсивной функции, вы начинаете с защитного состояния - тест, который говорит вам, когда вы сделали:

if change in coinValueList: 
    return 1 

Чтобы преобразовать это в список монет, просто возврата список из 1 монеты:

if change in coinValueList: 
    return [ change ] 

В другой части вашей функции, вы знаете, что ваши рекурсивные вызовы будут возвращать список. Так, просто взять список и сделать его больше список:

 numCoins = 1 + recMC(coinValueList,change-i) 

становится:

 coins = [ i ] + recMC(coinValueList, change - i) 

Вы должны обновить другие тесты, а также.

Смежные вопросы