Проблема размена монет с динамическим программированием

Это мой код, касающийся проблемы обмена монет для печати общего количества способов для набора монет и целевой суммы.

def coin_change(coins,amount):
    table=[0 for k in range(amount+1)]
    table[0]=1
    for coin in coins:
        for x in range(coin,amount+1):
            table[x] = table[x]+ table[x-coin]
        print(table)  

    return table[amount]

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

например, если набор монет равен [1,3,5], а целевая сумма равна 6, то всего возможны 4 способа. [[1,1,1,1,1,1,],[1,1,1,3],[3,3],[1,5]] Я хочу получить этот список в качестве вывода.


person yash bhawsar    schedule 17.05.2020    source источник


Ответы (3)


Вы можете легко адаптировать свой текущий код для создания списковых решений.

def coin_change(coins,amount):
    table=[[] for k in range(amount+1)]
    table[0].append([]) # or table[0] = [[]], if you prefer
    for coin in coins:
        for x in range(coin,amount+1):
            table[x].extend(solution + [coin] for solution in table[x-coin])
        print(table)  

    return table[amount]

Переменная table теперь представляет собой список списков списков, причем внутренние списки представляют собой комбинации монет, которые в сумме дают заданное значение, а не просто количество таких комбинаций. Вместо добавления новых комбинаций я использую генераторное выражение, которое мы передаем в extend.

person Blckknght    schedule 17.05.2020
comment
Большое спасибо за это решение :) - person yash bhawsar; 17.05.2020
comment
Есть ли способ быть на связи? - person yash bhawsar; 17.05.2020

Ответ отредактирован в соответствии с вашим требованием:

def combine(parent, me):
    if len(parent) == 0:
        return [[me]]
    new_list = []
    for entry in parent:
        new_list.append(entry + [me])
    return new_list


def get_ways(amount, coins):
    table = [0 for k in range(amount + 1)]
    table[0] = 1
    ways = [[] for _ in range(amount + 1)]
    for coin in coins:
        for x in range(coin, amount + 1):
            table[x] = table[x] + table[x - coin]
            ways[x].extend(combine(ways[x - coin], coin))
    print(ways[amount])
    return table[amount]


print(get_ways(6, [1, 3, 5]))

Выход:

[[1, 1, 1, 1, 1, 1], [1, 1, 1, 3], [3, 3], [1, 5]]
4
person Balaji Ambresh    schedule 17.05.2020
comment
пожалуйста, просмотрите отредактированный пост с добавлением примера, каков ожидаемый результат. - person yash bhawsar; 17.05.2020
comment
Большое спасибо за ваше решение :) - person yash bhawsar; 17.05.2020

person    schedule
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и/или как этот код отвечает на вопрос, повышает его ценность в долгосрочной перспективе. - person Matthew Cole; 22.09.2020