динамическое программирование монет, которые возвращают массив

1

Я пытаюсь получить все монеты, которые являются суммой целевого количества. Я смог получить необходимое количество монет. Как бы я пошел о решении этого.

Вы можете использовать те же монеты без ограничений, например. 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] порядка не имеет значения.

  • 1
    Пожалуйста, объясните более подробно, что вы хотите, чтобы произошло.
  • 0
    Вы хотите, чтобы все результаты или лучший результат от динамического программирования? если вам нужен весь результат, динамическое программирование здесь не работает.
Теги:

3 ответа

1
Лучший ответ

Если вы используете 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]]

Надеюсь, что это поможет вам, и прокомментируйте, если у вас есть дополнительные вопросы. :)

  • 0
    Спасибо за помощь, это почти правильно. когда я использовал этот тестовый пример. print (изменить ([51, 1], 10)), вместо этого он возвращает [1, 1, 1, 1, 1, 1, 1, 1, 1, 1].
  • 1
    если вам нужен весь результат, я могу написать другую версию, но динамическое программирование может дать только лучший результат @ Дон
Показать ещё 4 комментария
1

Если вы хотите получить все комбинации, которые соответствуют целевой сумме, вы можете использовать следующий генератор:

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)]
  • 0
    генератор хорошая идея
0

Я считаю, что это ответ, который вы ищете, пожалуйста, разработайте свой вопрос, чтобы мы могли лучше понять, что нужно сделать :)

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
  • 0
    Может помочь, если вы расширите свой ответ с информацией, как вы поняли ОП

Ещё вопросы

Сообщество Overcoder
Наверх
Меню