Нет простого алгоритма для этой проблемы.
Ознакомьтесь с проблемой разбиения , также известной как самая простая трудная задача , которая решает эту проблему за 2 подхода. Эта проблема является NP-Complete, и вы должны быть в состоянии найти все алгоритмы для ее решения в Интернете
Я знаю, что ваша проблема немного отличается, так как вы можете выбрать количество подходов, но вы можете вдохновить себя от решений предыдущего.
Например:
Вы можете преобразовать это в серию линейных программ, пусть k будет номером элемента в вашем наборе.
{a1 ... ak} is your set
For i = 2 to k:
try to solve the following program:
xjl = 1 if element j of set is in set number l (l <= i) and 0 otherwise
minimise max(Abs(sum(apxpn) -sum(apxpm)) for all m,n) // you minimise the max of the difference between 2 sets.
s.t
sum(xpn) on n = 1
(sum(xkn) on k)-(sum(xkm) on k) <= 1 for all m n // the number of element in 2 list are different at most of one element.
xpn in {0,1}
if you find a min less than one then stop
otherwise continue
end for
Надеюсь, мои записи понятны.
Сложность этой программы экспоненциальная, и если вы найдете полиномиальный способ решения этой проблемы, вы будете проверять P = NP, поэтому я не думаю, что вы можете добиться большего успеха.
РЕДАКТИРОВАТЬ
Я видел ваш комментарий, я неправильно понял ограничение на размер подмножеств (я думал, что это разница между 2 наборами)
У меня нет времени, чтобы обновить его, я сделаю это, когда у меня будет время.
sryy
РЕДАКТИРОВАТЬ 2
Я отредактировал линейную программу, и она должна делать то, что ей предлагается Я только добавил ограничение.
Надеюсь, на этот раз проблема полностью понятна, хотя это решение может быть неоптимальным