SprintCode.pro

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

Super

Coin Change (Размен монет)

Описание: Даны номиналы монет и сумма. Верните минимальное количество монет, которым можно набрать сумму. Монеты можно брать многократно. Если набрать невозможно, верните -1.

Пример 1:

Вход: coins = [1,2,5], amount = 11
Выход: 3
Объяснение: 11 = 5 + 5 + 1

Пример 2:

Вход: coins = [2], amount = 3
Выход: -1
Объяснение: Нечётную сумму двойками не набрать

Ограничения:

1 <= coins.length <= 12

0 <= amount <= 10⁴

Рекомендуемая временная и пространственная сложность

Стремитесь к O(amount · количество монет) по времени.


Подсказка 1

Жадный подход (брать самую крупную монету) даёт неверный ответ. Проверьте на coins = [1,3,4], amount = 6.


Подсказка 2

Пусть dp[i] — минимум монет для суммы i. Через какие состояния можно прийти в i?


Подсказка 3

В i приходим из i − c для каждой монеты c. Значит dp[i] = min(dp[i − c]) + 1.

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

Входные параметры :

[1,2,5], 11

Ожидаемый результат

3