Вот оптимальное решение для поиска комбинаций любого набора заданных монет, которые складываются в любую общую сумму.
def change(amount, coins_available, coins_so_far):
if sum(coins_so_far) == amount:
yield coins_so_far
elif sum(coins_so_far) > amount:
pass
elif coins_available == []:
pass
else:
for c in change(amount, coins_available[:], coins_so_far+[coins_available[0]]):
yield c
for c in change(amount, coins_available[1:], coins_so_far):
yield c
amount = 500
coins = [5, 25]
solutions = [s for s in change(amount, coins, [])]
i = 1
for s in solutions:
print str(i) + " : " + str(s)
i += 1
print 'optimal solution:', min(solutions, key=len)