【问题标题】:Greedy algorithm implementation, Haskell [closed]贪心算法实现,Haskell [关闭]
【发布时间】:2016-07-15 17:40:12
【问题描述】:

我需要实现一个 Haskell 函数,它接收一个 Int(卡车装载能力)和一个 Int 列表(可以在卡车上装载的盒子模型)。

定义哪些盒子模型必须优先放置在 卡车,要求容量更大的箱子 相对于可用空间,总是放在第一位。

该算法应返回要放置在卡车上的箱子模型列表。我不知道如何将此编程为功能范式:/

maximizeLoad 103 [15, 20, 5, 45, 34]
[45, 45, 5, 5]

谢谢!

【问题讨论】:

  • 用另一种语言你会怎么做?
  • 为什么不是[34, 34, 34]?尝试阅读子集和问题并确定您的解决方案首先需要具备哪些属性。
  • 这个问题看起来像背包(蛮力将是maximumBy (compare `on` sum) . filter ((<= 103) . sum) $ subsequences [15,20,5,45,34]) - 但这不允许多次挑选物品
  • @RowanBlush 抱歉,我编辑了解决方案的属性。谢谢!
  • @ErikR 找到较重的盒子。添加 (heavierBox % truckCapacity) 较重的箱子。取小于该除法其余部分的最大值,并重复该过程。对吗?

标签: algorithm haskell optimization maximize


【解决方案1】:

Bruce force 方法与智能过滤

maximumLoad n = head 
              . head 
              . group length 
              . last 
              . group sum 
              . filter ((<= n) . sum)
              . map concat 
              . sequence 
              . map (rep n)
              . reverse 
              . sort
        where rep n x = take ((div n x)+1) $ iterate (x:) []
              group f = groupBy ((==) `on` f) . sortBy (comparing f) 

> maximumLoad 103 [15, 20, 5, 45, 34]
[34,34,20,15]

UPDATE 对于贪心算法,会简单很多。我认为代码很容易阅读来描述算法。期望反向排序的输入列表。

maxLoad _ [] = []
maxLoad n (x:xs) | n==0 = []
                 | x <= n = x: maxLoad (n-x) (x:xs)
                 | otherwise = maxLoad n xs

> maxLoad 103 $ reverse $ sort [15, 20, 5, 45, 34]
[45,45,5,5]

【讨论】:

  • 但大箱子优先加载。
  • 这不是解决方案吗?如果不是规范,则需要在组件大小和未实现容量之间进行权衡。
  • 输出应该是:maximizeLoad 103 [15, 20, 5, 45, 34] [45, 45, 5, 5]
  • 比 103 少 3!什么是权衡?否则,贪心算法就可以了。假设 100 目标和[60, 50] 解决方案应该是[60] 还是[50, 50]
  • 对于[60, 50],算法会输出[60]。
猜你喜欢
  • 2016-01-29
  • 2023-04-02
  • 2022-12-07
  • 2019-04-27
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多