Алгоритм псевдополитайма для ранца можно использовать для k=2
.Лучшее, что мы можем сделать - это сумма (S) / 2.Запустите алгоритм ранца
for s in S:
for i in 0 to sum(S):
if arr[i] then arr[i+s] = true;
, затем посмотрите на сумму (S) / 2, затем на сумму (S) / 2 +/- 1 и т. Д.
Для 'k> = 3«Я считаю, что это NP-полная, как проблема с 3 разделами.
Самый простой способ сделать это для k> = 3 - это просто перебрать его, вот один из способов, не уверенный, самый ли это самый быстрый или самый чистый.
import copy
arr = [1,2,3,4]
def t(k,accum,index):
print accum,k
if index == len(arr):
if(k==0):
return copy.deepcopy(accum);
else:
return [];
element = arr[index];
result = []
for set_i in range(len(accum)):
if k>0:
clone_new = copy.deepcopy(accum);
clone_new[set_i].append([element]);
result.extend( t(k-1,clone_new,index+1) );
for elem_i in range(len(accum[set_i])):
clone_new = copy.deepcopy(accum);
clone_new[set_i][elem_i].append(element)
result.extend( t(k,clone_new,index+1) );
return result
print t(3,[[]],0);
Имитация отжига могла бы быть хорошей, но, поскольку «соседи» конкретного решения не совсем ясны, генетический алгоритм мог бы лучше подойти для этого.Вы начнете со случайного выбора группы подмножеств и «мутирования» путем перемещения чисел между подмножествами.