我正在阅读CLRS试图自己学习并努力找到这一部分。
我正在尝试解决,并没有真正的解决方案来参考。
让我们说你输入:x1, x2, x3, ..., xn m1, m1, m3, ... mn M1 and M2
然后你必须输出:A partition into two disjoint subsets S, T (so the intersection is an empty set) so that the sum of each mk (1<=k<=n) of all elements in S is <= M1 and the sum of each mk (1<=k<=n) of all elements in T is <= M2, so that the total value sum of all (xk's in S) + (xk's in T) is maximized. where (1<=k<=n)
我试图证明它在NP中。 当我进行动态编程时,我遇到了类似的问题,相信这是背包。但这似乎有点复杂。我一直在写废纸,但似乎没有在哪里。这是出于个人兴趣。
答案 0 :(得分:1)
我们将此作为决定版本:
是否存在分区S,T使得S和T不相交,S&lt; = M1的总重量,T&lt; = M2的总重量和S∪T的总值> = Y ?
(我将它重新改编为“重量”和“价值”,以便与背包的连接更加明显)
现在,这是NP吗?
是。有几种方法可以显示NP的成员资格,最简单的方法可能就是这样:有一个证人可以让我们(在多项式时间内)验证YES答案是否正确。证人只是S和T对。这里的验证也不需要任何技巧,只测试问题中提到的所有条件。
它也是NP-Complete,因为它将解决背包实例。这个问题就好像有两个背包,只需将其中一个的大小调为零,然后再回到常规背包。