背包问题中的互斥项

8

虽然标准的背包问题可以通过动态规划解决,但我试图稍微改变一下问题来澄清我的概念,但我发现这可能比我想象的更难。

原始的背包问题是这样的:给定一个大小为W的背包和一个物品列表,其中物品的重量为w[i],价值为v[i],找到能够放入背包中且总价值最高的物品子集。

据我所知,这可以通过动态规划以O(Wn)的时间复杂度完成,其中n是物品数量。


现在,如果我尝试添加m个限制条件,每个条件都是一对互斥选择的物品(即如果存在物品A和物品B的限制,则我只能选择其中一个而不能同时选择两个)

在这样的限制条件下,这个问题仍然可以在O(Wn)的时间复杂度内通过动态规划解决吗?

1个回答

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)时间执行动态规划算法。

我还在消化中,但听起来很有道理...只是为了澄清我的想法,这是否意味着如果每个约束条件不是一对,而是一组项目,其中每个项目必须是相互排斥的,那么仍然可以使用具有O(Wn)时间复杂度的类似算法吗? - shole
只要约束条件不重叠(没有任何一个项目同时出现在多个约束条件中),这种方法就可以扩展到约束条件中的多个项目。 - Abhishek Bansal
谢谢,我正在尝试使用这个概念实现一个简单的代码,一旦完成,我会尽快接受它... - shole
当我实现一个所有元素都包含在某个约束中的情况时,我遇到了一些困难...递归公式有点混乱,但我相信这是正确的方向,谢谢 :) - shole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接