子集和问题,可以对每个数字进行加或减。

| 给定一个包含
n
个正整数的集合
A
,我如何找到可以使用集合中的所有元素获得的最小整数> = 0。可以将每个元素相加或相减。 很少有例子可以阐明这一点。
A = [ 2, 1, 3]
Result = 0
(2 +1-3)
A = [1, 2, 0]
Result = 1
(-1 + 2 + 0)
A = [1, 2, 1, 7, 6]
Result = 1
(1 + 2-1-7 + 6)     
已邀请:
您可以使用布尔整数编程来解决。有几种算法(例如Gomory或分支和绑定)和免费库(例如LP-Solve)可用。 计算列表的总和并将其称为。将列表中的数字加倍。假设双倍的数字是a,b,c。然后,您具有以下方程式系统:
Boolean x,y,z 

a*x+b*y+c*z >= s

Minimize ax+by+cz!
布尔变量指示应添加相应的数字(为true时)还是减去相应的数字(为false时)。 [编辑] 我应该提到,转换后的问题也可以看作是“背包问题”:
Boolean x,y,z 

-a*x-b*y-c*z <= -s

Maximize ax+by+cz!
    

要回复问题请先登录注册