Ищем алгоритм решения уникальной задачи

У меня есть шесть массивов, каждому из которых дано (не обязательно уникальное) значение от одного до пятидесяти. Мне также дается несколько предметов, которые я могу разделить между ними. Значение каждого элемента определяется массивом, в котором он находится. Массивы могут содержать бесконечные или нулевые элементы, но сумма элементов во всех массивах должна равняться исходному количеству заданных элементов.

Я хочу найти лучшую конфигурацию элементов в массивах, при которой сумма значений элементов в каждом отдельном массиве как можно ближе друг к другу.

Например, предположим, что у меня есть три массива со значением 10 и три массива со значением 20. Для девяти элементов один входит в каждый из массивов «20», а два - в каждый из «10». массивов, так что сумма каждого массива равна 20, а общее количество элементов равно девяти.

Я не могу добавить дробное количество элементов в массив, и числа почти никогда не делятся идеально, как в этом примере, но всегда существует решение, в котором разница между суммами минимальна.

В настоящее время я использую грубую силу для решения этой проблемы, но при большем количестве элементов производительность страдает. Я чувствую, что есть математический ответ на эту проблему, но я даже не знаю, с чего начать.


person Spenser Galloway    schedule 02.05.2020    source источник
comment
Под минимальной разницей между суммами вы подразумеваете максимальную разницу между любыми двумя массивами или сумму разностей для всех пар массивов, или это что-то еще?   -  person Roman Svistunov    schedule 02.05.2020


Ответы (1)


Легко написать жадный алгоритм, предлагающий приблизительное решение. Просто всегда добавляйте следующий элемент в массив с наименьшей суммой значений.

Массив с наибольшим значением должен находиться в пределах 1 элемента от правильности.

Для каждого количества элементов в массиве с наибольшим значением вы можете повторить упражнение. Получение массива со вторым по величине значением с точностью до 1.

Продолжите их все, и с 6 массивами вы получите 3^5 = 243 возможное расположение элементов (обратите внимание, что количество элементов в последнем массиве полностью определяется первыми 5). Выберите лучшее из них, и ваш комбинаторный взрыв будет сдержан.

(Этот подход должен работать, если вы пытаетесь минимизировать разницу значений между наибольшим и наименьшим массивами и имеете фиксированное количество массивов.)

person btilly    schedule 02.05.2020