Основная идея верна, но вам нужно рассмотреть некоторые проблемы с рекурсией и то, что вы хотите считать правильным ответом.
Если вы начнете просто, вы можете спросить, сколько комбинаций [1,5,10,25]
должно равняться 6
:
Должно быть 3:
[1, 1, 1, 1, 1, 1], [5, 1], [1, 5]
?
или 2:
[1, 1, 1, 1, 1, 1], [1, 5]
?
Два имеет для меня самый смысл.Для этого вам нужно передать подмножество вашего массива монет обратно в рекурсию, поэтому, когда вы находитесь в цикле for, смотрящем на 5, вы больше не учитываете [5, 1]
- возможно, вы уже подсчитали [1, 5]
на данный момент,Вместо передачи неиспользуемого параметра c
, передайте список coins
.Затем управляйте этим списком в цикле.Здесь я добавил дополнительный параметр cur
, чтобы собирать комбинации только для проверки работы.Вам это не нужно, если вы просто хотите считать.
def makeChange(A, coins, cur = None):
''' This will also collect the combinations to check the work'''
if cur is None:
cur = []
global callsMade
callsMade += 1
if(A == 0):
print(cur)
return 1
if(A < 0):
return 0
combos = 0
for i, coin in enumerate(coins):
if coin > A: # don't bother if coin is too big
continue
# pass a subset of the list into recursion
combos += makeChange(A - coin, coins[i:], cur + [coin])
return combos
coinset = [1,5,10,25]
A = 10
makeChange(A, coinset)
Результат:
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 5]
[5, 5]
[10]
Out[456]:
4
Установка A
на 200
показывает 1463
комбинаций.