如何将子集总和减少到分区?


Answers:


19

(L,B)是子集和的一个实例,其中L是数字的列表(多集),而B是目标和。让S=L。令L是通过将加到形成的列表S+B,2SBL

(1)如果有一个子列表求和到,然后大号'可以被划分为两个相等的部分:中号{ 2 小号- }大号中号{ 小号+ }。实际上,第一部分的总和为B + 2 S - B = 2 S,第二部分的总和为S - B + S + BMLBLM{2SB}LM{S+B}B+(2SB)=2S(SB)+(S+B)=2S

(2)如可以被划分为两个相等的部分P 1P 2,则存在的子列表大号求和到。实际上,由于S + B + 2 S - B = 3 S并且每个部分的总和为2 S,因此这两个元素属于不同的部分。不失一般性,2 小号- P 1P 1中的其余元素属于LP1,P2LB(S+B)+(2SB)=3S2S2SBP1P1和总和LB


2
但是标准子集和问题使用所有整数,而分区问题仅使用非负整数...
gukoff 2013年

即使使用非负整数,SUBSET-SUM也是NP完全的,例如,从3SAT进行的归约最终将使用非负整数。同样,可能会直接从整数SUBSET-SUM减少到非负整数SUBSET-SUM。
Yuval Filmus 2013年

1
是的,我知道,这种减少非常容易。请注意,它不是“默认”形式的子集总和。:)
gukoff

如果L也可以大号{小号-}?作为| {BSB}| =B,像| L| =B大号大号{小号-}|{小号-}|=|大号|=
好奇

1
@Issam不会,这个PARTITION实例将始终具有解L,{B,SB}
Yuval Filmus 2014年

1

@Yuval Filmus提到的答案是错误的(仅在没有负整数的情况下才是正确的)。考虑以下多重集:

{5,2,2,2,2,2}

目标总和为。我们知道没有子集。现在,我们为分区问题构造实例。添加两个新元素是2 σ - = 12σ + = 3。多重集现在是: { - 5 2 2 2 2 2 3 12 }和总和为2022σt=12σ+t=3

{5,2,2,2,2,2,3,12}
20

该分区的问题解决了答案给子集在这里,2种新的元素在同一子集(有没有其他办法可以分割成一半的总和)。因此,这是一个反例。正确答案如下:

{2,2,2,2,2}

添加一个值为的元素。现在,多组的总和为2 t。解决分配问题,它将得出总和t的 2个子集。只有一个分区将包含新元素。我们选择另一个总和为t的分区,并通过将其简化为一个分区问题解决了子集问题。这就是链接的解释。2tσ2ttt


1
但是,正如尤瓦尔(Yuval)在对他的答案的评论中所说,即使我们限制为正整数,子集总和也是NP-完全的。因此我们可以假设没有负数。
David Richerby

1
是的,我同意,即使在正整数的情况下,子集总和也是NP完全的。我只是为任何整数提供了更完整的证明。
罗希特·库马尔·耶拿

1
“仅提供更完整的证据”,并错误地声称现有答案不正确。
David Richerby

1
从某种意义上说,它不适用于负整数,这是不正确的。:)和平:)
罗希特·库马尔·耶拿

1

这是一个简单的证明:

显而易见,可以在多项式时间内验证SET-PARTITION。给定一个分区P1,P2只是将两者相加并验证它们的和彼此相等,这显然是一次多项式时间验证(因为求和是多项式运算,并且我们最多只能执行|X|许多求和)。

证明的核心在于将SUBSETSUM减为PARTITION;为此给定X和值t(子集之和查询)我们形成一组新的X=X{s2t}其中s=xXx。看到这是减少:

  • )假设存在一些SX使得t=xSx然后我们将具有

    st=xS{s2t}x,
    st=xX(S{s2t})x
    ,我们将有一个S{s2t}X(S{s2t})形成的分区X

  • )假设有一个分区P1,P2X,使得xP1x=xP2x。注意,这引起一个自然分区P1P2X,使得WLOG我们有

    s2t+xP1x=xP2x
    s2t+xP1x+xP1x=xP2x+xP1x=s
    s2t+2xP1x=s
    xP1x=t

因此,从一个溶液t=xSx可以形成一个分区之前P1=S{s2t}P2=X(S{s2t})从一个分区并且相反地P1,P2,我们可形成soltuion t=xP1{s2t}x,因此,映射FXŤX是一个减少(因为XŤ是在语言/组SUBSETSUMX=FXŤ被(在语言/集合“ PARTITION”中),可以清楚地看到转换是在多项式时间内完成的。


0

子集总和:

输入:{a1,a2,...,am} st M = {1..m}并且ai为非负整数,并且S1 {1..k}和Σai(i∈S)= t

划分:

输入:{a1,a2,...,am}和S⊆{1,···,m} stΣai(i∈S)=Σaj(j∉S)

分区Np证明: 如果证明者为验证者提供了partitions(P1,P2),则验证者可以轻松计算P1和P2的总和,并在线性时间内检查结果是否为0。

NP_Hard:SubsetSum≤pPARTITION

令x为SubsetSum的输入,并且x = <a1,a2,...,am,t>和Σai(i从1到m)= a

情况1:2t> = a:

令f(x)= <a1,a2,...,am,am + 1>其中am + 1 = 2t−a

我们想证明x∈SubsetSum⇔f(x)∈PARTITION

因此存在S⊆{1,...,m} st T = {1..m}-S和Σai(i∈T)=

令T'= {1 ... m,m + 1}-S因此Σaj(j∈T')= a-t + 2t-a = t

恰好是Σai(i∈S)= t,它表示f(x)∈PARTITION

现在我们还将证明f(x)∈PARTITION⇔x∈SubsetSum

因此存在S⊆{1,...,m,m + 1} st T = {1,...,m,m + 1}-S和Σai(i∈T)= [a +(2t-a )-t] = t

它显示Σai(i∈T)=Σaj(j∈S)因此m +1∈T和S⊆{1,···,m}和Σai(i∈S)= t

所以x∈SubsetSum

情况2:2t = <a

我们可以检查,但是这次am + 1是a−2t


-3

该链接很好地描述了归约,分区到子集和和子集到分区的两个简化。我认为这比YUVAL的答案更为明显。 有用的链接


4
请不要发布仅链接的答案。如果链接上的内容更改或不可用,您的答案将变得无用。即使链接不可用,也请修改您的答案以使它有用(例如,以您自己的语言来重申内容,并提供链接作为参考和来源)。
Tom van der Zanden
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.