[英]Reducing knapsack problem to an inverse knapsack problem
1)假设我们有一个常见的0-1背包问题。 给定一组从1到n的n个项,每个项的权重为w_i,值为v_i,最大权重为W。在这里,我们需要选择一些对象,以使v_i的总和最大化,从而所选对象的w_i之和不会超过给定的W数。
maximize∑(v_i*x_i), such that ∑(w_i*x_i)≤ W
2)现在假设我们有同样的问题,但是我们需要选择对象,以使它们的值之和最小,并且其权重之和不能小于给定的数字。
minimize∑(v_i*x_i), such that ∑(w_i*x_i)≥ W.
知道第一个问题是NP完全的,我如何证明第二个问题具有相同的复杂性,换句话说NP也是完整的吗?
知道第一个问题是NP完全的,我如何证明第二个问题具有相同的复杂性,换句话说NP也是完整的吗?
如果要证明问题B
是NP完全问题,则必须证明存在从A
到B
的多项式时间约简,其中已知A
是NP完全问题。
从一个问题的多项式时间减少A
一个问题B
是解决问题的算法A
使用呼叫的多项式数为问题的子程序B
那些子程序调用的外部,并且多项式时间。( 源 )。
因此,根据您的情况,您可以轻松地将多项式时间从背负问题简化为逆背负问题。
这两个问题是等效的(找到一个最佳解决方案可以立即解决另一个问题)。
令S
为对象的集合, M
为S
的对象的权重之和, W
为背包的容量。 然后,我们有:
(i)
找到对象的子集,以使它们的权重之和不超过W
并且其值之和最大 相当于
(ii)
找到对象的子集,以使它们的权重之和至少为MW
并且其值之和最小。 这是因为,如果S'
是(i)
的最优解,则S\\S'
是(ii)
的最优解(ii)
反之亦然)。
这是多项式时间减少( O(1)
调用子程序,多项式运算次数),因此反向背包确实是NP完全的。
关键思想似乎是交换价值和权重,并对第二个问题使用二元搜索来构造约简。
给定第一个公式的实例I
的值v_i
和权重w_i
,通过交换利润和权重来构造第二个问题的实例。 所有权重的总和(现在是利润)由
n * w_max
其中w_max
是最大重量。 这个数字本身在输入的编码长度中是指数的。 但是,我们可以使用二进制搜索来确定最大可实现利润,从而不超过初始容量W
这可以在
log( n * w_max )
迭代,即对输入的编码大小进行多项式限定的数字,对第二个问题使用相同次数的算法调用。 所描述的算法是从第一个问题到第二个问题的多项式预测。
逆背包是我的最爱之一。 尽管我从未明确证明它是NP完整的,但我确实知道如何将问题重新构造为背包问题本身,这应该可以解决问题:
与其将对象添加到空袋子中,不如考虑从要装满的袋子中选择要去除的对象的问题。 然后,由于权重的数量不能少于给定的数量,因此就对象而言,我们最多只能删除总计(权重-最小权重)。
由于要使价格最小化,因此必须将要移除的物体的价格最大化。
我们剩下最初的背包问题,在这里我们必须选择一组物品(要移走),以使它们的价格最大化,并且它们的总重量不超过最小重量。 (最后,我们将未删除的项目作为解决方案)
我们已经将问题改成恰好是原始的背包问题,因此它也必须是NP完全的。
这种方法的优点是我个人不知道什么NP可以完成它。 我刚刚证明反向背包和背包是完全等效的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.