如何选择加权项目以实现利润最大化?

时间:2013-11-23 04:47:03

标签: algorithm knapsack-problem maximization

这可能听起来像一个简单的问题,但我无法得到一个好的解决方案。问题类似于背包问题,但略有修改。

我有一个具有固定容量的包,比如说C.我们有一个项目列表及其权重。所有物品的总重量都大于C.我如何适应包中的最大物品数量(同时尽量填充袋子)?

我想要对列表进行排序并选择项目,直到包完全填满,但下面的例子反驳了这个想法

C = 100和 L = 50,40,20,30。

当我排序时,我得到20,30,40,50,因此我的分配将是(20 + 30 + 40)= 90.但我们可以获得更好的组合(20 + 30 + 50)= 100。

通过将每个项目的权重等于其权重,将此问题转换为背包,可以解决问题。还有其他算法吗?

2 个答案:

答案 0 :(得分:1)

免责声明:这不是最有效的解决方案;但是,这是 a 解决方案。

我会 -

  • 生成所有可能的金额
  • 按最大容量(bagSize)过滤总和
  • 从生成的金额中获取最大金额
  • 按最大总和过滤总和
  • 按最大剩余项目数查找并过滤

这是每个人最喜欢的语言的例子 - Haskell!

import Data.List

knappsack bagSize items = answers
  where
    sums = [(xs, sum xs) | xs <- subsequences items]
    sumFilter = filter ((<= bagSize) . snd) sums
    maxSum = foldl max 0 . map (sum . fst) $ sumFilter
    maxFilter = filter ((== maxSum) . snd) sumFilter
    maxLen = foldl max 0 . map (length . fst) $ maxFilter
    lenFilter = filter ((== maxLen) . length . fst) maxFilter
    answers = lenFilter

答案 1 :(得分:1)

根据你的评论,如果目标是让袋子尽可能充满,那么问题只是背包问题,其值等于它们的重量。

使用Wikipedia中给出的动态编程技术解决它。