Подбор чисел из массива с суммой большей или равной К

135
18 ноября 2019, 12:30

Перечитал много материала, задача о ранце не подходит, потому что значение нужно либо большее (с минимальной разницей), либо равное заданному числу. Суть: есть массив из чисел, есть число. Задача: найти индексы чисел из массива, сумма которых либо минимально превышает, либо равна числу. Числа можно использовать неограниченное количество раз, но приоритет должен отдаваться более крупным числам (по возможности). Пишу на 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)
Answer 1

Обычный subset sum с перехлёстом вверх.

Создать массив длиной "1 +нужная сумма + наибольшее число из массива", заполнить нулями, только в нулевой элемент записать -1 (не ноль, и не число из массива)

Для каждого элемента массива заполнить те ячейки, суммы в которых можно получить из имеющихся + данный элемент

 for coin in coins:
     for i = 0 .. sum-1:
         if A[i] !=0:
              A[i+coin] = coin 

Если входной массив сортирован, то предпочтение более крупным получится при обходе с малых.

READ ALSO
Сохранение файлов программы (Java, Android) [дубликат]

Сохранение файлов программы (Java, Android) [дубликат]

На данный вопрос уже ответили:

137
Как сохранить вложенную запись из JSON в SQLite?

Как сохранить вложенную запись из JSON в SQLite?

Я получаю данные в таком виде:

162
Отправить POST запрос на сайт в котором нет form

Отправить POST запрос на сайт в котором нет form

Хочу прикрутить к андроид приложению авторизацию на сайт https://wspkbtu

152
Какие различия между findFirst и findAny в Java 8?

Какие различия между findFirst и findAny в Java 8?

Я не очень понимают отличие findFirst() от findAny() в Java Stream API

116