Я бы попробовал генетические алгоритмы, так как это очень хорошая проблема - применять их.
Кодификация - это просто двоичная строка длины N, что означает 0 в первой группе и 1 во второй группе. Дайте отрицательную пригодность, когда количество элементов в каждой группе отличается, и положительную пригодность, когда суммы похожи ... Что-то вроде:
fitness(gen) = (sum(gen)-n/2))^2 + (sum(values[i]*(-1)**gen[i] for i in 0..n))^2
(И минимизировать пригодность)
Конечно, это может дать вам неоптимальный ответ, но для больших реальных проблем этого обычно достаточно.