如何从列表中获取整数,其总和小于X?

时间:2014-05-23 16:25:41

标签: list haskell list-comprehension

对不起这里的烂摊子。 我想要一个经典的贪婪算法来解决haskell中用于整数的背包问题。 但还有其他问题 - 如何在列表理解中引用列表?

2 个答案:

答案 0 :(得分:2)

有几种方法:

生成所有较小的列表。花费最长的

对于每个n <= X,生成[1..n]并检查其总和是否为x。拿这些最长的一组:

allLists x = takeWhile ( (<=x) . sum) $ inits [1..]
theList    = last . allLists

其中inits来自Data.List

或者,我们还记得数学

我们知道[1..n]的总和是n*(n+1)/2。我们想要x >= n * (n+1)/2We solve for nn应为0.5 * (sqrt (8 * x + 1) - 1)。由于这不是一个自然数字,我们将其置于:

theList x  = [1..n]
   where n = floor $ 0.5 * (sqrt (8 * (fromIntegral x) + 1) - 1)

答案 1 :(得分:1)

这将为所有列表提供其总和不大于100:

takeWhile (\l -> sum l <= 100) $ inits [1..]