同时子集总和

时间:2018-05-02 15:34:26

标签: dynamic-programming subset-sum

我正在处理一个问题,这是一个子集和问题的变体,我希望额外的约束可以使它比经典的子集和问题更容易解决。我已经搜索了这个约束的问题但是我无法在StackOverflow上或通过google搜索其他地方找到一个合适算法的好例子。

问题:

假设你有两个正数A1,A2,A3 ......和B1,B2,B3 ......列表,元素数N相同。有两个和Sa和Sb。问题是找到同时设置Q其中| sum(A {Q}) - Sa | &lt; = epsilon和| sum(B {Q}) - Sb | &lt; = epsilon。因此,如果Q是{1,5,7}那么A1 + A5 + A7-Sa <= epsilon和B1 + B5 + B7-Sb <= epsilon。 Epsilon是一个任意小的正常数。

现在,我可以将其解决为两个完全独立的子集和问题,但是去除同时性约束会导致错误解决方案的可能性(其中Qa!= Qb)。我还怀疑额外的约束应该使这个问题比两个NP完全问题更容易。我想在两个数字列表中解决一个包含18个以上元素的实例,并且大多数子集求和算法具有这么多元素的长运行时间。我已经研究了伪多项式运行时动态编程算法,但是它存在以下问题:a)速度依赖于数字列表的短位深度(这不一定适用于我的实例)和b)它确实不考虑同时性约束。

关于如何使用同时性约束来减少运行时间的任何建议?我是否可以使用动态编程方法来考虑这种约束?

1 个答案:

答案 0 :(得分:0)

如果我理解你对问题的描述(我很困惑为什么你有“sum(A {Q}) - Sa”和“sum(B {Q}) - Sb”周围的距离符号,它似乎不适合其余的解释),那就是在NP中。

您可以通过从子集和(SUB)减少到同时子集和(SIMSUB)来看到这一点。 如果你有一个由问题X = {x1,x2,...,xn}和一个名为t的目标组成的SUB问题,你有一个算法在给定两组A = {a1,a2,...时解决SIMSUB ,a}和B = {b1,b2,...,bn},两个中间人Sa和Sb以及epsilon的值然后我们可以像这样解决SUB: 设A = X,设B为长度n的集合,仅由0组成。设置Sa = t,Sb = 0和epsilon = 0.您现在可以针对此问题运行SIMSUB算法并获得SUB问题的解决方案。 这表明SUBSIM至少与SUB一样难,因此在NP中。