有了限制,可以用贪心算法解决背包难题吗?

时间:2017-09-26 18:54:26

标签: algorithm knapsack-problem greedy

我知道一般来说背包问题,没有已知的贪婪算法来解决它。但是,假设我们添加了以下约束:

•所有项目的值均等于其权重(对于所有i,w(i)= v(i))

•权重都是2的幂(对于所有w(i)存在n∈N,使得w(i)= 2 ^ n)。

现在,以下约束的背包问题可以有一个贪婪的算法,选择当前适合背包的最重的物品,直到剩下的物品都不适合。

这会起作用还是真的没有办法用贪婪的算法解决受约束的背包问题?

1 个答案:

答案 0 :(得分:0)

通常,背包问题有两种类型,一种是您可以拿走一部分物品(例如,一袋沙子的50%),另一种是您必须拿走整个物品。后者被称为0/1背包(全有或全无),这是我相信您所指的。

第一个可以贪婪地求解,以单位为单位获取所有最大价值的物品(例如,每磅$ x),直到容量即将满为止,然后用剩余的最高价值物品的百分比按单位填充其余的价值。第二,没有您的约束,通常无法贪婪地解决。

现在查看您的约束。在回答这个问题时,我假设值是按单位而不是总计,因为这会改变算法。认为2美元的商品重2磅,8美元的商品重8磅,而2磅重的商品每磅重2美元(总计4美元),而8磅重的商品每磅重8美元(总计64美元),因此有动机购买较重的商品第一。可以通过以下方法来贪婪地解决此问题:首先取出可能最重的物品,然后再取出最重的物品,依此类推,直到袋子中不再容纳更多物品为止,这就是您所描述的算法。

之所以起作用的原因是,由于具有2的幂和假定的每磅值,因此低于可放入背包中的最大值的所有值的总和仍小于最大值。想一想,放置一个8磅重的物品(总价值= $ 64),我将失去机会放置数量为2和4磅重的物品(总价值分别为$ 4和$ 16)。无论背包的重量(等于或大于8),都不会只有2和4的组合值会高过8的贡献(如果您认为5个4磅重的商品价格为80美元,则认为重量相同的情况下,一件8磅的商品和3磅4磅的商品的价格最好为112美元)。由于最重的物品不能被其下的物品高估,因此最好选择最重的物品,这会给您一个贪婪的解决方案。