📜  设置分区为NP完成

📅  最后修改于: 2021-10-25 04:50:09             🧑  作者: Mango

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

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

说明
问题的一个实例是为问题指定的输入。设置分区问题的一个实例是一组S,并且任务是检查是否存在具有元素作为总和的总和S的任何两个非重叠的分区。由于 NP-Complete 问题是一个既属于NP属于 NP-hard的问题,因此问题是 NP-Complete 的证明由两部分组成:

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

但是不可能将每个 NP 问题都化简为另一个 NP 问题以始终显示其 NP-Completeness。因此,证明一个问题是 NP-Complete 则证明该问题在 NP 中并且任何 NP-Complete 问题都可以简化为,即如果 B 是 NP-Complete 并且 B ≤ P C对于 NP 中的 C,则 C 是 NP -完全的。因此,可以使用以下两个命题得出 Set 划分问题是 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. 验证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’
现在以下观察结果成立:

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

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

此外, S’ – S = {s – 2t} 。所以A是 S的子集,总和等于t

因此,满足子集和问题。

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程。