Вы можете решить эту проблему, используя булево целочисленное программирование. Существует несколько алгоритмов (например, Gomory или Branch and Bound) и бесплатные библиотеки (например, LP-Solve).
Рассчитайте сумму списка и назовите ее s. Удвойте числа в списке. Скажем, удвоенные числа a, b, c. Тогда у вас есть следующая система уравнений:
Boolean x,y,z
a*x+b*y+c*z >= s
Minimize ax+by+cz!
Булевы переменные указывают, следует ли добавлять соответствующее число (если оно истинно) или вычитать (если оно ложно).
[Изменить]
Следует отметить, что преобразованную проблему можно рассматривать как " проблема с рюкзаком ":
Boolean x,y,z
-a*x-b*y-c*z <= -s
Maximize ax+by+cz!