Вот мой дубль.Одна интересная вещь заключается в том, что нам нужно проверить минимальные монеты, необходимые для формирования до coin_with_max_value (25 в нашем случае) - только 1.После этого просто посчитайте сумму этих минимальных монет.С этого момента нам просто нужно добавить определенное количество coin_with_max_value, чтобы сформировать любое число вплоть до общей стоимости, в зависимости от разницы общей стоимости и найденной суммы.Вот и все.
Итак, для значений, которые мы берем, как только будут найдены минимальные монеты на 24: [1, 2, 2, 5, 10, 10].Нам просто нужно продолжать добавлять 25 монет для каждых 25 значений, превышающих 30 (сумма минимальных монет).Окончательный ответ на 99:[1, 2, 2, 5, 10, 10, 25, 25, 25]9
import itertools
import math
def ByCurrentCoins(val, coins):
for i in range(1, len(coins) + 1):
combinations = itertools.combinations(coins, i)
for combination in combinations:
if sum(combination) == val:
return True
return False
def ExtraCoin(val, all_coins, curr_coins):
for c in all_coins:
if ByCurrentCoins(val, curr_coins + [c]):
return c
def main():
cost = 99
coins = sorted([1, 2, 5, 10, 25], reverse=True)
max_coin = coins[0]
curr_coins = []
for c in range(1, min(max_coin, cost+1)):
if ByCurrentCoins(c, curr_coins):
continue
extra_coin = ExtraCoin(c, coins, curr_coins)
if not extra_coin:
print -1
return
curr_coins.append(extra_coin)
curr_sum = sum(curr_coins)
if cost > curr_sum:
extra_max_coins = int(math.ceil((cost - curr_sum)/float(max_coin)))
curr_coins.extend([max_coin for _ in range(extra_max_coins)])
print curr_coins
print len(curr_coins)