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


Answers:


19

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

(1)如果有一个子列表求和到乙,然后大号'可以被划分为两个相等的部分:中号∪ { 2 小号- 乙}和大号∖ 中号∪ { 小号+ 乙}。实际上,第一部分的总和为B + (2 S - B )= 2 S,第二部分的总和为(S - B )+ (S + BM⊆LBL′M∪{2S−B}L∖M∪{S+B}B+(2S−B)=2S。(S−B)+(S+B)=2S

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


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

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

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

如果L也可以是大号⋃{乙,小号-乙}?作为| {B,S−B}| =B,像| L| =B大号′大号⋃{乙,小号-乙}|{乙,小号-乙}|=乙|大号|=乙
— 好奇

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

1

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

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

目标总和为。我们知道没有子集。现在,我们为分区问题构造实例。添加两个新元素是2 σ - 吨= 12和σ + 吨= 3。多重集现在是: { - 5 ,2 ,2 ,2 ,2 ,2 ,3 ,12 }和总和为20。−22σ−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∪{s−2t}其中s=∑x∈Xx。看到这是减少:

  • (⟹)假设存在一些S⊂X使得t=∑x∈Sx然后我们将具有

    s−t=∑x∈S∪{s−2t}x,
    s−t=∑x∈X′∖(S∪{s−2t})x
    ,我们将有一个S∪{s−2t}和X′∖(S∪{s−2t})形成的分区X′

  • (⟸)假设有一个分区P1′,P2′的X′,使得∑x∈P1′x=∑x∈P2′x。注意,这引起一个自然分区P1和P2的X,使得WLOG我们有

    s−2t+∑x∈P1x=∑x∈P2x
    ⟹s−2t+∑x∈P1x+∑x∈P1x=∑x∈P2x+∑x∈P1x=s
    ⟹s−2t+2∑x∈P1x=s
    ⟹∑x∈P1x=t

因此,从一个溶液t=∑x∈Sx可以形成一个分区之前P1=S∪{s−2t},P2=X′∖(S∪{s−2t})从一个分区并且相反地P1′,P2′,我们可形成soltuion t=∑x∈P1′∖{s−2t}x,因此,映射F:(X,Ť)→X′是一个减少(因为(X,Ť)是在语言/组SUBSETSUM⇔X′=F(X,Ť)被(在语言/集合“ 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.