Answers:
实际上,您已经从特殊降至一般。通过设置,您基本上是在使用通用算法来解决特殊问题。
另一方面(即从一般减少为特殊):
假设你正在给一组和一些,你必须确定是否存在的一些子集其资金以。
现在,您要解决此问题,给定一种算法,可以确定某些子集的总和是否为。
现在,如果,我们可以轻松地简化为:。
具有和的一个子集当且仅当具有总和的一个子集。
当我们可以为某些i设置x_i \ le 0时,就会出现问题。
我们可以假设(为什么?)。
假设正的总和是和负是。 P X 我 Ñ
现在构造一个新的集合这样
M = P + | N | + K,其中。
每个。
现在在集合上运行零子集和算法
容易表明,如果具有总和的子集,则以上集合中的至少一个具有总和为零的子集。ķ
我会将另一方向的证明留给您。
可以通过以下事实来固定Aryabhata的答案:我们可以将所有数字乘以一个大,然后在每个数字上加上一些小数字以充当“状态标签”,然后提供一些额外的数字以使我们去零,如果我们能得到没有他们。具体来说,我们将使用和1作为状态标记。c K c = 2 (n + 1 )
给定目标值为的一般问题的实例,我们将创建特定问题的实例(目标值为0),该实例包含:
我假设随着Aryabhatta的出现,为正。(由于已经有6年了,所以我将为读者回答他的练习:之所以这样做,是因为如果我们在一般问题的一个实例(包括交换所有数字的符号,则最后得到一个新的等价问题实例,这意味着一个解决正实例的算法就足以解决任何问题-要解决一个负实例,我们可以执行此符号交换,运行该算法并将其答案转发为原始问题的答案。当然,如果那么我们根本不需要将一般情况转换为特殊情况!)K K K K = 0
首先让我们证明,对一般问题的给定实例的是,对特殊问题的构造实例的回答是。 在这里,我们可以假设一些解决方案一般的问题存在:那就是,这个非空集合数的款项,以。因此,如果我们采取相应 -值到我们的解决方案的构造实例,它们将总结到。然后,我们可以选择在解决方案中包括,使我们剩下。由于,这在范围内,我们可以通过包含一些上拉数字来成功上拉到0。
现在,让我们说明对构造实例的“是”答案意味着对原始给定实例的“是”答案。 在这里,乘以变得很重要-这就是使我们可以确定所包含的额外数字不能“做太多”的地方。
在这里,我们可以假定存在一些构造实例的解决方案:也就是说,此数字的非空集合的总和为0根据问题要求,该解决方案至少包含一个要素。此外,它必须至少包含一个元素,因为没有它,就不可能达到0的总数:如果仅存在上拉数字,则总和必须在范围内(注意,在这种情况下,必须至少存在一个上拉数字,并且所有上拉均严格为正,因此总和不能为0);而如果解决方案仅由和一些上拉数组成,则总数必然为负,因为ž ž = - 2 ķ (Ñ + 1 )- ñ ≤ - ñ ñ - 1,上拉数字最多可以将和增加。
现在假设矛盾的是,解不包含。每个元素都包含两个术语:倍数和+1“状态标记”。请注意,如果选择了该元素,则的元素中的每个元素上的+1项会使总和增加1,所选择的最多拉数字中的每个数字也是如此,因此这2元素的总和任何解决方案的来源至少为1(因为我们在上一段中确定,必须选择至少一个元素),并且最多。特别是,这意味着这两组项的总和取模时 z 2 (n + 1 )Y 2 (n + 1 )2 (n + 1 )ž = - 2 ķ (ñ + 1 )-为非零。在解决方案不包含的假设下,该总和中仅有的其他分量是的选定成员贡献的的倍数,当取模。因此,以模为模时,解中所有项的总和为非零,这意味着它不能等于目标总和0,这意味着它根本不是有效的解:我们发现了一个矛盾,这意味着必须在每个解决方案中都存在。
因此,每个解决方案都包含。我们知道
,
我们可以重新排列以下术语:
。
由于总和为0,取为模时必须保持为0 ,这意味着我们可以舍弃所有包含倍数的项,以获得新方程
。
可以直接将其代入前面的等式以获得
。
最后,将两边除以叶子
,
这为原始的一般问题实例提供了解决方案。