📜  设置分区是NP完整的

📅  最后修改于: 2021-05-08 18:10:56             🧑  作者: Mango

设置分区问题设置分区问题将数字数组划分为两个子集,以使这两个子集的总和相同。设S为一组数字,A为总和为S1的数字子集,则存在另一个子集,其中包含元素总和为S2的其余元素(S – A) ,并且S1等于S2

问题陈述给定一个N个数的集合S ,任务是确定集合是否包含S的两个分区,并且两个分区的总和完全相同。

说明
问题的一个实例是为问题指定的输入。集合分区问题的一个实例是集合S ,任务是检查是否存在S个元素的总和为sum的两个不重叠的分区。由于NP-Complete问题是NPNP-hard都存在的问题,因此证明问题为NP-Complete的陈述的证明包括两部分:

如果仅满足第二个条件,则该问题称为NP-Hard

但是不可能始终将每个NP问题都简化为另一个NP问题以显示其NP完整性。因此,要证明问题是NP完全的,然后证明问题出在NP上,并且任何NP完全的问题都可以还原为NP,例如,如果B是NP完全并且B≤P C对于NP中的C,则C是NP -完全的。因此,可以使用以下两个命题得出结论:集划分问题是NP-Complete:

设置分区问题在NP中:
如果NP中存在任何问题,则给定一个“证书”,该证书可以解决该问题并提供该问题的一个实例(在这种情况下为集合S以及两个分区AA’ ),则可以证明多项式时间的证书。这可以通过以下方式完成:

  1. 对于A中的每个元素xA’中的每个x’ ,验证是否覆盖了所有属于S的元素。
  2. S1为0, S2为0
  3. 对于A中的每个元素x ,将该值添加到S1
  4. 对于A’中的每个元素x’ ,将该值添加到S2中
  5. 验证S1S2相同。

该算法将线性时间花费在数字集的大小上。

设置分区问题是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’
现在,以下观察成立:

因此,可以将原始集合划分为两个总和(s – t)的子集。因此,满足了设置分区的问题。
现在假设存在S’ = S∪{s-2t}的等和分区(A,A’) 。每个分区的总和由下式给出:

将包含元素{s – 2t}的分区视为A’ 。设A = A’- {s – 2t}A中元素的总和由下式给出:

同样, S’– S = {s – 2t} 。因此, A是S的子集,总和等于t

因此,满足了子集和问题。