虽然标准的背包问题可以通过动态编程来解决,但我试图稍微扭转问题以清除我的概念,但我发现它可能比我想象的更难。
原始背包问题是,给定尺寸为W
的背包,以及重量为w[i]
并且值为v[i]
的项目列表,找到适合的项目子集背包总价值最高。
据我了解,这可以通过O(Wn)
动态编程完成,其中n
是项目数。
现在,如果我尝试添加m
约束,它们中的每一个都是一对只能互相挑选的项目(即如果存在项目A和项目B的约束,那么我只能采取其中一个但不是两个都是
在这样的约束下,O(Wn)
中的动态编程是否仍能解决这个问题?
答案 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)
时间内执行动态编程算法。