Answers:
令是子集和的一个实例,其中是数字的列表(多集),而是目标和。让。令是通过将加到形成的列表。
(1)如果有一个子列表求和到乙,然后大号'可以被划分为两个相等的部分:中号∪ { 2 小号- 乙}和大号∖ 中号∪ { 小号+ 乙}。实际上,第一部分的总和为B + (2 S - B )= 2 S,第二部分的总和为(S - B )+ (S + B。
(2)如可以被划分为两个相等的部分P 1,P 2,则存在的子列表大号求和到乙。实际上,由于(S + B )+ (2 S - B )= 3 S并且每个部分的总和为2 S,因此这两个元素属于不同的部分。不失一般性,2 小号- 乙∈ P 1。P 1中的其余元素属于和总和乙。
@Yuval Filmus提到的答案是错误的(仅在没有负整数的情况下才是正确的)。考虑以下多重集:
目标总和为。我们知道没有子集。现在,我们为分区问题构造实例。添加两个新元素是2 σ - 吨= 12和σ + 吨= 3。多重集现在是: { - 5 ,2 ,2 ,2 ,2 ,2 ,3 ,12 }和总和为20。
该分区的问题解决了答案给子集在这里,2种新的元素在同一子集(有没有其他办法可以分割成一半的总和)。因此,这是一个反例。正确答案如下:
添加一个值为的元素。现在,多组的总和为2 t。解决分配问题,它将得出总和t的 2个子集。只有一个分区将包含新元素。我们选择另一个总和为t的分区,并通过将其简化为一个分区问题解决了子集问题。这就是链接的解释。
这是一个简单的证明:
显而易见,可以在多项式时间内验证SET-PARTITION。给定一个分区只是将两者相加并验证它们的和彼此相等,这显然是一次多项式时间验证(因为求和是多项式运算,并且我们最多只能执行许多求和)。
证明的核心在于将SUBSETSUM减为PARTITION;为此给定和值(子集之和查询)我们形成一组新的其中。看到这是减少:
()假设存在一些使得然后我们将具有
()假设有一个分区的,使得。注意,这引起一个自然分区和的,使得WLOG我们有
因此,从一个溶液可以形成一个分区之前,从一个分区并且相反地,我们可形成soltuion ,因此,映射是一个减少(因为是在语言/组SUBSETSUM被(在语言/集合“ PARTITION”中),可以清楚地看到转换是在多项式时间内完成的。
子集总和:
输入:{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
该链接很好地描述了归约,分区到子集和和子集到分区的两个简化。我认为这比YUVAL的答案更为明显。 有用的链接