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也是完整的?
答案 0 :(得分:1)
知道第一个问题是NP完全的,我如何证明第二个问题具有相同的复杂性,换句话说NP也是完整的?
如果要证明问题B
是NP完全的,则必须证明存在从A
到B
的多项式时间缩减,其中A
被认为是NP完全问题。
从问题A
到问题B
的多项式时间约简是一种算法,它使用对问题A
的子例程的多项式调用来解决问题B
,并且这些子例程调用之外的多项式时间。(source)。
因此,在您的情况下,您可以轻松地将多项式时间从背包问题简化为逆背包问题。
这两个问题是等效的(找到一个最佳解决方案可以立即解决另一个问题)。
假设S
是对象集合,M
是S
对象的权重之和,和W
的背包容量。
然后,我们有:
(i)
找到对象的子集,以使它们的权重之和不超过W
并且其值之和最大等效于
(ii)
查找对象的子集,以使它们的权重之和至少为M-W
,并且其值之和最小。 这是因为,如果S'
是(i)
的最优解,那么S\S'
是(ii)
的最优解(反之亦然)。
这是多项式时间减少(O(1)
调用子例程,多项式运算次数),因此反向背包的确是NP完全的。
答案 1 :(得分:0)
关键思想似乎是交换价值和权重,并对第二个问题使用二元搜索来构造减法。
给出第一个公式的实例I
的值v_i
和权重w_i
,通过交换利润和权重来构造第二个问题的实例。所有权重之和(现在是利润)由
n * w_max
其中w_max
是最大重量。这个数字本身在输入的编码长度中是指数的。但是,我们可以使用二进制搜索来确定最大可实现利润,从而不超过初始容量W
。这可以在
log( n * w_max )
iterations,一个对输入的编码大小进行多项式限定的数字,使用相同数量的第二个问题的算法调用。所描述的算法是从第一个问题到第二个问题的多项式预测。
答案 2 :(得分:-2)
反背包是我的最爱之一。尽管我从未明确证明它是NP完整的,但我确实知道如何将问题重新构造为背包问题本身,这应该可以解决问题:
不要将对象添加到空袋子中,而是要考虑从装满的袋子中选择要去除的对象的问题。然后,由于权重的数量不能小于给定的数量,因此必须仅除去对象的总数(权重-最小重量)。
由于要最小化价格,因此必须将要移除的对象的价格最大化。
我们剩下的是最初的背包问题,我们必须选择一组物品(待移除),以使它们的价格最大化,并且其总重量不超过最小重量。 (最后,我们将未删除的项目作为解决方案)
我们已经将问题重整为原始的背包问题,因此它也必须是NP完全的。
这种方法的优点是我个人不知道什么NP可以完成它。我刚刚证明反向背包和背包是完全等效的。