将背包问题简化为逆背包问题

时间:2019-05-16 12:35:28

标签: algorithm knapsack-problem proof np-complete proof-of-correctness

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也是完整的?

3 个答案:

答案 0 :(得分:1)

  

知道第一个问题是NP完全的,我如何证明第二个问题具有相同的复杂性,换句话说NP也是完整的?

如果要证明问题B是NP完全的,则必须证明存在从AB的多项式时间缩减,其中A被认为是NP完全问题。
从问题A到问题B的多项式时间约简是一种算法,它使用对问题A的子例程的多项式调用来解决问题B,并且这些子例程调用之外的多项式时间。(source)。

因此,在您的情况下,您可以轻松地将多项式时间从背包问题简化为逆背包问题。
这两个问题是等效的(找到一个最佳解决方案可以立即解决另一个问题)。
假设S是对象集合,MS对象的权重之和,和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可以完成它。我刚刚证明反向背包和背包是完全等效的。