我有一个列表和一个值,如何将列表元素插入新列表,直到这些元素的总和不超过该值?
问题是如何在没有新列表元素的情况下返回上述新列表和初始列表?
例如,我有一个列表[13,8,7,6,4,2,2,1]
和一个值21
。所以,我想将该列表的元素插入到一个新列表中,其中总和为less than or equal to 21
。在此示例中,新列表将为[13,8]
,并且必须从初始列表中删除13,8
。
所以函数的最终输出应该是两个列表:[13,8]
,[7,6,4,2,2,1]
我已经编写了这段代码,但它有一些令人困惑的错误:
fun Scheduler (w:Wopt , L:PTList)=
let
val ptl1=[List.hd L]
val TempL=L
val head=List.hd L
in
if ListSum(ptl1) = w
then (ptl1, Delete(L))
else (
if ListSum(ptl1) + head <= w
then Scheduler(Insert(head,ptl1), Delete(TempL))
else (ptl1,Delete(L))
)
end
答案 0 :(得分:1)
fun splitFor n [] = ([], [])
| splitFor n (x::xs) =
if x > n then ([], x::xs) else
let val (ys, zs) = splitFor (n - x) xs
in (x::ys, zs) end
(* Example *)
val (a, b) = splitFor 21 [13,8,7,6,4,2,2,1]