解决背包的变化,其中项目的价值取决于已经在袋中的物品

时间:2015-08-04 21:52:18

标签: c++ algorithm dynamic-programming knapsack-problem

我试图解决以下问题:
我有一组N项,其中每对项目都有一个相互得分,我需要选择W个项目的组合,以便总得分最高。
例如i,j,k项的总分为

score(i,j) + score(i,k) + score(j,k).

为了避免经历所有N^W种可能的组合,我考虑对0-1背包问题做一个变化,并通过动态编程解决这两个变化:

  1. 将所有权重设置为等于1(因此最终我将在我的麻袋中获得W个项目)
  2. 不是每个项目都有一个恒定值数组,而是在运行中计算值#34;"根据当前检查的项目和当时已经在袋中的物品。
  3. 我已经开始使用这两个变化对解决方案进行编码,但是现在我更多地考虑它,我担心它不能通过动态编程解决,因为"最佳子结构&#34 ;财产没有 例如,如果W=3和项i,j,k是最佳解决方案,那么对于W=2i,j不一定是最佳解决方案(根据以上总分的计算) 。
    有没有人知道如何通过动态编程解决这个问题而不是O(N^W)暴力?

    由于

1 个答案:

答案 0 :(得分:0)

你的问题是NP难的,这意味着几乎肯定没有快速多项式时间算法来解决它,因为没有人能够提出多项式时间算法来解决NP难问题。要查看NP-硬度,假设您有一个图表,其中节点是您的索引,如果i和j之间有边,则定义i,j之间的分数为1,否则为0.如果可以,则在多项式时间内,找到包含最多W个节点的节点的最大分数子集,然后您可以在多项式时间内确定图中是否存在大小为W的团。这是NP完全问题。