子集和问题,可以添加或减去每个数字

时间:2011-04-21 08:03:17

标签: algorithm subset-sum partition-problem

给定A包含n正整数的集A = [ 2, 1, 3],如何找到所有可以获得的最小整数> = 0 >集合中的元素。每个元素可以添加或减去到总数。 很少有例子说明这一点。

Result = 0

A = [1, 2, 0](2 + 1 - 3)

Result = 1

A = [1, 2, 1, 7, 6]( - 1 + 2 + 0)

Result = 1

{{1}}(1 + 2 - 1 - 7 + 6)

1 个答案:

答案 0 :(得分:2)

您可以使用布尔整数编程来解决它。有几种算法(例如Gomory或分支和绑定)和免费库(例如LP-Solve)可用。

计算列表的总和并将其命名为s。将列表中的数字加倍。假设加倍的数字是a,b,c。然后你有以下方程式系统:

Boolean x,y,z 

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

Minimize ax+by+cz!

布尔变量指示是否应添加相应的数字(当为真时)或减去(当为假时)。

<强> [编辑]

我应该提一下,转换后的问题也可以看作是“knapsack problem”:

Boolean x,y,z 

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

Maximize ax+by+cz!