设置分区问题:设置分区问题将数字数组划分为两个子集,以使这两个子集的总和相同。设S为一组数字,A为总和为S1的数字子集,则存在另一个子集,其中包含元素总和为S2的其余元素(S – A) ,并且S1等于S2 。
问题陈述:给定一个N个数的集合S ,任务是确定集合是否包含S的两个分区,并且两个分区的总和完全相同。
说明:
问题的一个实例是为问题指定的输入。集合分区问题的一个实例是集合S ,任务是检查是否存在S个元素的总和为sum的两个不重叠的分区。由于NP-Complete问题是NP和NP-hard都存在的问题,因此证明问题为NP-Complete的陈述的证明包括两部分:
- The problem itself is in NP class.
- All other problems in NP class can be polynomial-time reducible to that. (B is polynomial-time reducible to C is denoted as B ≤ PC)
如果仅满足第二个条件,则该问题称为NP-Hard 。
但是不可能始终将每个NP问题都简化为另一个NP问题以显示其NP完整性。因此,要证明问题是NP完全的,然后证明问题出在NP上,并且任何NP完全的问题都可以还原为NP,例如,如果B是NP完全并且B≤P C对于NP中的C,则C是NP -完全的。因此,可以使用以下两个命题得出结论:集划分问题是NP-Complete:
设置分区问题在NP中:
如果NP中存在任何问题,则给定一个“证书”,该证书可以解决该问题并提供该问题的一个实例(在这种情况下为集合S以及两个分区A和A’ ),则可以证明多项式时间的证书。这可以通过以下方式完成:
- 对于A中的每个元素x和A’中的每个x’ ,验证是否覆盖了所有属于S的元素。
- 令S1为0, S2为0
- 对于A中的每个元素x ,将该值添加到S1 。
- 对于A’中的每个元素x’ ,将该值添加到S2中。
- 验证S1与S2相同。
该算法将线性时间花费在数字集的大小上。
设置分区问题是NP-Hard:
为了证明独立集问题是NP-Hard,请将已知的NP-Hard问题简化为该问题。进行减少,从中可以将子集总和问题简化为集合分区问题。子集问题以数字S和目标总和t的集合形式提供输入,该问题的目的是找到属于S的子集T ,其总和与t相同。令S为S的成员之和。现在,将S’= S∪{s-2t}馈入Set Partition问题。
现在证明,计算集分区的问题确实可以归结为子集和的计算。减少可以通过以下两个命题证明:
现在,让我们考虑一组数字T ,其总和等于t (子集总和),那么S中的其余元素(假设O )将具有总和o = s – t 。让我们假设原始集合等于T’= T∪(s – 2t) ,其总和等于t’ 。
现在,以下观察成立:
o = s – t
o – t = s – 2t, Difference in sum between O and T.
t’ = t + (s – 2t)
= s – t
= o, the sum of T’ and O are equal.
因此,可以将原始集合划分为两个总和(s – t)的子集。因此,满足了设置分区的问题。
现在假设存在S’ = S∪{s-2t}的等和分区(A,A’) 。每个分区的总和由下式给出:
将包含元素{s – 2t}的分区视为A’ 。设A = A’- {s – 2t} 。 A中元素的总和由下式给出:
A = s – t – {s – 2t}
= t
同样, S’– S = {s – 2t} 。因此, A是S的子集,总和等于t 。
因此,满足了子集和问题。