这可能听起来像一个简单的问题,但我无法得到一个好的解决方案。问题类似于背包问题,但略有修改。
我有一个具有固定容量的包,比如说C.我们有一个项目列表及其权重。所有物品的总重量都大于C.我如何适应包中的最大物品数量(同时尽量填充袋子)?
我想要对列表进行排序并选择项目,直到包完全填满,但下面的例子反驳了这个想法
C = 100和 L = 50,40,20,30。
当我排序时,我得到20,30,40,50,因此我的分配将是(20 + 30 + 40)= 90.但我们可以获得更好的组合(20 + 30 + 50)= 100。
通过将每个项目的权重等于其权重,将此问题转换为背包,可以解决问题。还有其他算法吗?
答案 0 :(得分:1)
免责声明:这不是最有效的解决方案;但是,这是 a 解决方案。
我会 -
这是每个人最喜欢的语言的例子 - 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中给出的动态编程技术解决它。