Я пытаюсь получить все монеты, которые являются суммой целевого количества. Я смог получить необходимое количество монет. Как бы я пошел о решении этого.
Вы можете использовать те же монеты без ограничений, например. change([2], 10)
=> [2, 2, 2, 2, 2]
def change(coins, amount):
result = [amount+1] * (amount+1)
result[0] = 0
for i in range(1, amount+1):
for coin in coins:
if i >= coin:
result[i] = min(result[i], result[i-coin] + 1)
if result[amount] == amount+1:
return -1
return result[amount]
change([1, 2, 5,8], 7)
=> [5, 2]
порядка не имеет значения.
Если вы используете dyanmic programming
вы можете получить только лучший результат, вы можете достичь этого, используя массив для хранения среднего результата dynamic programming
, который я изменил в зависимости от вашей версии dp:
def change(coins, amount):
result = [amount+1] * (amount+1)
coins_results = [[] for _ in range(amount+1)]
result[0] = 0
for i in range(1, amount+1):
for coin in coins:
if i >= coin and result[i - coin] + 1 < result[i]:
result[i] = result[i-coin] + 1
coins_results[i] = coins_results[i-coin] + [coin]
if result[amount] == amount+1:
return []
return coins_results[amount]
тестовое задание:
print(change([1, 2, 5, 8], 7))
print(change([2], 10))
выход:
[5, 2]
[2, 2, 2, 2, 2]
Вот версия для вывода всех результатов путем backtracking
:
def change(coins, amount):
res = []
def backtrack(end, remain, cur_result):
if end < 0: return
if remain == 0:
res.append(cur_result)
return
if remain >= coins[end]:
backtrack(end, remain - coins[end], cur_result + [coins[end]])
backtrack(end - 1, remain, cur_result)
backtrack(len(coins) - 1, amount, [])
return res
тестовое задание:
print(change([1, 2, 5, 8], 7))
print(change([2], 10))
выход:
[[5, 2], [5, 1, 1], [2, 2, 2, 1], [2, 2, 1, 1, 1], [2, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1]]
[[2, 2, 2, 2, 2]]
Надеюсь, что это поможет вам, и прокомментируйте, если у вас есть дополнительные вопросы. :)
Если вы хотите получить все комбинации, которые соответствуют целевой сумме, вы можете использовать следующий генератор:
def change(coins, amount):
for i, coin in enumerate(coins):
if coin == amount:
yield (coin,)
elif coin < amount:
yield from ((coin,) + x for x in change(coins[i:], amount - coin))
print(list(change([2], 10))) # [(2, 2, 2, 2, 2)]
print(list(change([1, 2, 5, 8], 7))) # [(1, 1, 1, 1, 1, 1, 1), (1, 1, 1, 1, 1, 2), (1, 1, 1, 2, 2), (1, 1, 5), (1, 2, 2, 2), (2, 5)]
Я считаю, что это ответ, который вы ищете, пожалуйста, разработайте свой вопрос, чтобы мы могли лучше понять, что нужно сделать :)
def change(coins, amount):
ret = [] # Here we keep all possible solves
solves = [] # Here we keep all unique solves, to avoid duplicates (Eg.: [5, 2] and [2, 5] are both a solution to 7)
for c1 in coins:
for c2 in coins:
if c1 + c2 == amount: # Check if the solve is a match
solve = [c1, c2]
if not set(solve) in solves: # Check if the solve is not a duplicate
ret.append(solve)
solves.append(set(solve))
return ret # Return a list of solves