先决条件: NP完成度,子集总和问题
子集总和问题:给定N个非负整数a 1 …a N和目标总和K ,任务是确定是否存在一个总和等于K的子集。
说明:问题的一个实例是为问题指定的输入。子集和问题的一个实例是集合S = {a 1 ,…, N }和整数K。由于NP完全问题是NP和NP难题中的一个问题,因此证明问题为NP完全的陈述的证明包括两部分:
- 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完全问题是还原到那么我们完成也就是说,如果B是NP完全和B≤P下NP中的C,则C为NP-Complete。因此,我们可以使用以下两个命题来验证子集总和问题是NP-Complete的:
子集总和在NP中:
如果NP中有任何问题,那么给定证书,该证书可以解决问题和问题的实例(集合S的整数a 1 …a N和整数K ),我们将能够识别(是否解决方案正确与否)多项式时间内的证书。这可以通过检查子集S’中的整数之和等于K来完成。
子集总和为NP-Hard:
为了证明子集总和是NP-Hard,请将已知的NP-Hard问题简化为该问题。
进行还原,从该还原可以将“顶点覆盖问题”简化为“子集和”问题。让我们假设一个图G(V,E),其中V = {1,2,…,N}。现在,对于每个顶点i, a i = i 。对于每个边(i,j),我们定义一个称为b ij的分量。
我们将以矩阵格式表示整数,其中每一行均以| E | +1位对应整数值的以4为基数的形式表示。
矩阵具有以下属性:
- 第一列包含一个i的整数值1和一个b ij的整数值0。
- 从矩阵的右侧开始的每个E列代表每个边缘的数字。 (i,j)列等于a i , a j和b ij ,否则等于0。
- 我们定义一个常数k’使得
现在,以下命题成立:
- 让我们考虑分别为(V’,E’)的顶点和边的子集,这样
b ij在每一列中最多可以包含1个。同样,k’参数的所有低有效数字均为2,直至| E |。我们永远不能随身携带这些数字。现在,这些数字在每列中的总和最多为三个1。这意味着对于每个边(i,j),V’必须包含i或j。因此,V’成为顶点覆盖。
- 让我们假设存在一个大小为k的“顶点覆盖”,我们将选择整数a i使得i处于V’中,而所有b ij使得i或j处于V’中。对所有这些以基数4表示的整数求和(我们从矩阵中选择),我们得到整数之和= k’。因此,所选的整数形成sum = k’的整数子集。因此,子集总和成立。
让我们考虑以下示例,
给定一个顶点覆盖率V = {1,3}并且k = 2
现在,a 1 = 1,a 2 = 2,a 3 = 3,a 4 = 4
可以通过以下方式构造矩阵:
=>
=>
=>
现在,为了证明k’的值,让我们选择一个i使得i处于V’中,我们选择一个1和一个3以及一个b ij使得i或j都位于V’中,即我们选择b ij这样i或j在V’中,即我们从矩阵中选择b 12 ,b 14 ,b 23和b 34。在基数4表示中,我们具有以下值:
a 1 = 321,a 3 = 276,b 12 = 64,b 23 = 16,b 14 = 1,b 34 = 4
这些值是使用矩阵计算的。综合这些值,我们得出,
k’= 321 + 276 + 64 + 16 + 1 + 4 = 682。
因此,可以计算和验证k’值。
因此,子集总和问题是NP-完全的。