Задача Coin Change Combinations звучит так: дан список номиналов монет и целевая сумма, сколько различных комбинаций монет дают эту сумму?
Решение использует таблицу DP «снизу вверх», где dp[i] представляет количество различных способов составить сумму i.
def coin_change_ways(denominations, amount):
dp = [0] * (amount + 1)
dp[0] = 1
for coin in denominations:
for i in range(coin, amount + 1):
dp[i] += dp[i - coin]
return dp[amount]
dp[0] = 1 — это базовый случай — существует ровно один способ составить сумму ноль: не использовать никакие монетыcoin до amountdp[i] += dp[i - coin] означает: «добавь количество способов получить оставшуюся сумму после использования этой монеты»[1,2] и [2,1]O(n * m), где n — целевая сумма, m — количество номиналовO(n) для таблицы DPДля номиналов [1, 2, 3] и суммы 4 результат равен 4:
[1,1,1,1], [1,1,2], [1,3], [2,2]Внешний цикл должен итерировать по номиналам монет, а не по суммам, чтобы каждая различная комбинация считалась ровно один раз, а не рассматривала [1,2] и [2,1] как отдельные комбинации.
Новый — ещё не проверен сообществом
Вы