【问题标题】:Knapsack with mutually exclusive items带有互斥物品的背包
【发布时间】:2016-11-29 15:47:54
【问题描述】:

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

原来的背包问题是给定一个大小为W的背包,以及一个重量为w[i]且值为v[i]的物品的列表,找到总价值最高的背包中的物品子集.

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


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

在这样的约束下,O(Wn)中的动态规划还能解决这个问题吗?

【问题讨论】:

    标签: algorithm dynamic-programming


    【解决方案1】:

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

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

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

    因此,n 项目的最佳解决方案由以下两个值的最大值给出。
    1.n-1物品和W重量得到的最大值。
    2.v_n+n-1物品和W-w_n权重得到的最大值。

    现在,如果我们添加nth 或(n-1)th 项可以存在于解决方案中的约束,则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 只要约束不重叠(在多个约束中不存在任何项),这种方法可以扩展到约束中的多个项。
    • 谢谢,我正在尝试使用这个概念实现一个简单的代码,一旦我完成它会尽快接受它......
    • 在实现所有元素都包含在某些约束中的情况时,我遇到了一些困难......递归公式有点混乱,但我相信这是正确的方向,谢谢:)跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多