背包变异?

时间:2012-03-26 00:22:28

标签: c algorithm knapsack-problem variation

我搜索了这种类型的算法并且红了很多东西,但我无法找到我正在寻找的东西。

所以,我去购物,我有x钱,我的卡车可以承受重量,每件物品都有额外的重量和价格。输出应该给出最大的奖励积分,使得所选物品的总重量不超过卡车的容量和我必须花的钱!

我可以在这里使用一些帮助,你知道算法的名称吗?我该怎么办?我必须在C中做到这一点!

谢谢!

3 个答案:

答案 0 :(得分:0)

你有什么尝试?

这些类型的问题通常属于优化或约束满足的范畴。

尝试为您的问题编写函数表达式,看看是否可以使用简单的微积分或单纯形法解决它。

答案 1 :(得分:0)

我知道背包问题的两个变种。 0-1版本不能包含分数权重(接受或保留),例如,我不能采取第二个最佳选择的一半。另一个版本则相反,允许使用小数项目。这个小差异非常显着,并且有利于分数版本。

分数版本可以通过贪心算法解决。您可以使用最有价值的“单价”尽可能多地购买物品。重复,直到你的卡车装满。

0-1版本有点难,因为无法通过简单的贪婪算法解决。举个例子,假设你的卡车可以携带800磅。我们可以选择

  1. 1表重500磅,价值1000美元(单价2美元/磅)
  2. 1工作台:重量 - 701lb:价值 - $ 1577.25:单位$ 2.25 / lb
  3. 3个书柜:重量 - 100磅:价值 - 200美元:单位2美元/磅
  4. 一个贪婪的算法将占据最终的1577.25美元 最佳值是3个书柜,表= 1600美元。

    如果以上是小号背包版本,那么只需要将长凳和99磅的桌子/书柜放在一起,共计1775.25美元。

    在0-1的情况下,我们需要使用类似动态编程的东西来检查所有解决方案。

答案 2 :(得分:0)

项目权重和项目价格是约束。奖金积分是目标。因此,您有一个多维背包问题(一个目标;两个约束)。众所周知的动态编程解决方案背包将概括,但复杂性随着约束的数量呈指数增长。