【问题标题】:Subset sum problem where each number can be added or subtracted子集和问题,其中每个数字都可以相加或相减
【发布时间】:2011-08-10 02:52:22
【问题描述】:

给定一个包含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)

【问题讨论】:

  • 通过取最小的数字,然后减去所有其他数字来找到最小总和。你的意思是“最接近零”吗?
  • 我假设您的意思是“最小的和 >= 0”?
  • 这相当于通常的partition problem,已知是NP-complete。
  • @RB @ChrisWue 是的,最小和 >= 0
  • @Sven Marnach: NP-完全。它有一个伪多项式的动态规划解决方案 - O(poly(问题中数字的总和))。

标签: algorithm subset-sum partition-problem


【解决方案1】:

您可以使用布尔整数编程来解决它。有多种算法(例如 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!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-30
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多