Ctrl K

Размен монет под точную сумму

Сложная
В кошельке лежат монеты coins, номинал каждой — степень двойки. Нужно заплатить ровно amount, выбрав некоторые из монет без сдачи. За одну операцию можно разменять монету номиналом больше 1 на две монеты вдвое меньшего номинала. Верните наименьшее число разменов, после которых из кошелька можно выбрать монеты на сумму ровно amount. Если это невозможно, верните -1.
Пример 1
coins=[1, 4], amount=3 → 1

Размениваем 4 на две монеты по 2 и платим 1 + 2 = 3. Одного размена достаточно.

Пример 2
coins=[16], amount=3 → 4

16 → 8 + 8, затем 8 → 4 + 4, 4 → 2 + 2, 2 → 1 + 1. После четырёх разменов есть монеты 2 и 1.

Пример 3
coins=[2, 2], amount=5 → -1

Всего денег 4, а нужно 5 — размены сумму не меняют.

Ограничения
  • 1 ≤ len(coins) ≤ 1000
  • 1 ≤ coins[i] ≤ 2³⁰, и coins[i] — степень двойки
  • 1 ≤ amount < 2³¹
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиПерекладывание битов ради квадратов СложнаяСлить соседей ради малого OR СложнаяПереключения по рёбрам дерева СложнаяМаксимум двоичных строк после переворотов СредняяКомпании по четыре в кинозале Средняя
загружаем Python…
Вход
coins=[1, 4], amount=3
Ожидается
1

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 118 тестов на сервере, включая скрытые.