Перечитал много материала, задача о ранце не подходит, потому что значение нужно либо большее (с минимальной разницей), либо равное заданному числу. Суть: есть массив из чисел, есть число. Задача: найти индексы чисел из массива, сумма которых либо минимально превышает, либо равна числу. Числа можно использовать неограниченное количество раз, но приоритет должен отдаваться более крупным числам (по возможности). Пишу на Java, но буду благодарен за реализацию или указание на любом языке программирования.
Простой пример: {202, 403}, заданное число: 604. Ответ: индексы 0 и 1. Эти числа в сумме дают 605, 202*3 даст 606 - не подходит, так как есть более подходящий вариант. Другой пример: {202, 405}, заданное число: 604. Ответ: индексы 0, 0, 0. Сумма 606, другой вариант 607 - не подходит.
Код, который не работает:
var number = 603;
val coins = listOf<Int>(202, 404);
val result = HashMap<Int, Int>();
for (coin in coins) {
val count = number / coin;
number -= count * coin;
if (count > 0) {
result.put(coin, count)
}
}
println(result)
Обычный subset sum с перехлёстом вверх.
Создать массив длиной "1 +нужная сумма + наибольшее число из массива", заполнить нулями, только в нулевой элемент записать -1 (не ноль, и не число из массива)
Для каждого элемента массива заполнить те ячейки, суммы в которых можно получить из имеющихся + данный элемент
for coin in coins:
for i = 0 .. sum-1:
if A[i] !=0:
A[i+coin] = coin
Если входной массив сортирован, то предпочтение более крупным получится при обходе с малых.
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Хочу прикрутить к андроид приложению авторизацию на сайт https://wspkbtu
Я не очень понимают отличие findFirst() от findAny() в Java Stream API