带有互斥物品的背包

时间:2016-07-26 06:21:52

标签: algorithm dynamic-programming

虽然标准的背包问题可以通过动态编程来解决,但我试图稍微扭转问题以清除我的概念,但我发现它可能比我想象的更难。

原始背包问题是,给定尺寸为W的背包,以及重量为w[i]并且值为v[i]的项目列表,找到适合的项目子集背包总价值最高。

据我了解,这可以通过O(Wn)动态编程完成,其中n是项目数。

现在,如果我尝试添加m约束,它们中的每一个都是一对只能互相挑选的项目(即如果存在项目A和项目B的约束,那么我只能采取其中一个但不是两个都是

在这样的约束下,O(Wn)中的动态编程是否仍能解决这个问题?

1 个答案:

答案 0 :(得分:6)

假设:每个元素都包含在最多一个约束中。

对于通常的背包问题,问题表现出的最佳子结构如下:

对于每个项目,可能有两种情况:
1.该项目包含在解决方案中 2.未包含在解决方案中的项目。

因此,n项的最优解是由以下两个值的最大值给出的 1. n-1项和W项获得的最大值 2. v_n + n-1项和W-w_n权重获得的最大值。

现在,如果我们添加约束,n(n-1)项中的任何一个都可以存在于解决方案中,那么n项的最优解是由以下三个中的最大值给出的值。
1. n-2项和W项获得的最大值 2. v_n + n-2项和W-w_n项获得的最大值 3. v_(n-1) + n-2项和W-w_(n-1)权重获得的最大值。

因此我们将约束中的每对元素视为单个元素,并在O(Wn)时间内执行动态编程算法。