对不起这里的烂摊子。 我想要一个经典的贪婪算法来解决haskell中用于整数的背包问题。 但还有其他问题 - 如何在列表理解中引用列表?
答案 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)/2
。 We solve for n并n
应为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..]