Coin Change
У тебя есть неограниченный запас монет нескольких номиналов, и ты хочешь заплатить точную сумму, используя как можно меньше монет.
Кажется, что нужно брать самую крупную монету, которая подходит, но это может не сработать. Если есть монеты [1, 3, 4] и сумма 6, то выбор самой крупной монеты сначала даст 4 + 1 + 1 — три монеты, тогда как для 3 + 3 нужны всего две.
Надёжнее постепенно строить ответ, начиная с небольших сумм. Пусть fewest[t] — наименьшее количество монет, в сумме дающих t. Чтобы заплатить 0, монеты не нужны. Для любого другого t последняя использованная монета имеет некоторое значение c, а до её добавления оставалось t - c, поэтому
fewest[t] = 1 + the smallest fewest[t - c] среди всех монет c, номинал которых не превышает t.
Для [1, 3, 4]: fewest[3] = 1, а fewest[6] = 1 + fewest[3] = 2. Если ни одна монета не приводит к сумме, которую можно набрать, то сумму t вообще нельзя заплатить.
Напиши функцию с именем coinChange, которая получает coins — список различных номиналов монет — и целое число amount, а возвращает наименьшее количество монет, сумма которых в точности равна amount. Каждый номинал монеты можно использовать сколько угодно раз. Верни -1, если нужную сумму составить невозможно, и 0, если amount равен 0.
Например, для coins = [2, 5, 10] и amount = 27 функция возвращает 4 (10 + 10 + 5 + 2), а для coins = [4, 6] и amount = 7 возвращает -1.
Ограничения: 1 <= coins.length <= 12, 1 <= coins[i] <= 10^4, все значения различны, 0 <= amount <= 10^4.
Функция
- arg1integer-array
- arg2integer
- Возвращаетinteger
Примеры
- Ввод
- arg1 = [2, 5, 10]arg2 = 27
- Вывод
- 4
- Ввод
- arg1 = [4, 6]arg2 = 7
- Вывод
- -1
- Ввод
- arg1 = [3, 7]arg2 = 0
- Вывод
- 0
+12 скрытых тестов при отправке
Подсказки
Открывайте по одной. Каждая подсказывает чуть больше.
Выбор самой крупной подходящей монеты не всегда позволяет получить наименьшее количество монет. Проверьте это на монетах
[1, 3, 4]и сумме6.Предположим, вы уже знаете минимальное количество монет для каждой суммы, меньшей
t. Из каких меньших сумм можно получитьt, добавив ещё одну монету?Заполни таблицу
fewest[0..amount]от0по возрастанию:fewest[0] = 0, а каждоеfewest[t]на единицу больше наилучшегоfewest[t - c]среди монетc <= t. Для сумм, которые нельзя получить, укажи значение больше любого реального ответа, напримерamount + 1, а в конце замени его на-1.
Полный разбор этой задачи скоро появится.
Похожие задачи
Задачи на те же идеи. Решите две или три, и приём запомнится.
Python
def coinChange(coins, amount):
# Напишите код здесьСлучай 1
Случай 2
Случай 3
Ввод
arg1 = [2, 5, 10] arg2 = 27
Ожидается
4