let rec combinations n l =
match n, l with
| 0, _ -> [[]]
| _, [] -> []
| k, (x::xs) -> List.map ((@) [x]) (combinations (k-1) xs) @ combinations k xs
let rec cross xs = seq {
match xs with
| h :: t -> for e in t do yield h, e
yield! cross t
| [] -> ()
}
let solve n (lst : int list) =
seq { for e in 1..n do yield! combinations e lst }
|> Seq.groupBy List.sum
|> Seq.collect (snd >> Seq.toList >> cross)
solve 8 [1..16]
|> Seq.last
|> printfn "%A"
bGV0IHJlYyBjb21iaW5hdGlvbnMgbiBsID0KICAgICAgICBtYXRjaCBuLCBsIHdpdGgKICAgICAgICB8IDAsIF8gLT4gW1tdXQogICAgICAgIHwgXywgW10gLT4gW10KICAgICAgICB8IGssICh4Ojp4cykgLT4gTGlzdC5tYXAgKChAKSBbeF0pIChjb21iaW5hdGlvbnMgKGstMSkgeHMpIEAgY29tYmluYXRpb25zIGsgeHMKICAgICAKbGV0IHJlYyBjcm9zcyB4cyA9IHNlcSB7CiAgICAgICAgbWF0Y2ggeHMgd2l0aCAKICAgICAgICB8IGggOjogdCAtPiBmb3IgZSBpbiB0IGRvIHlpZWxkIGgsIGUgICAgICAgIAogICAgICAgICAgICAgICAgICAgIHlpZWxkISBjcm9zcyB0CiAgICAgICAgfCBbXSAtPiAoKQogICAgICAgIH0KICAgICAKbGV0IHNvbHZlIG4gKGxzdCA6IGludCBsaXN0KSA9IAogICAgICAgIHNlcSB7IGZvciBlIGluIDEuLm4gZG8geWllbGQhIGNvbWJpbmF0aW9ucyBlIGxzdCB9CiAgICAgICAgfD4gU2VxLmdyb3VwQnkgTGlzdC5zdW0KICAgICAgICB8PiBTZXEuY29sbGVjdCAoc25kID4+IFNlcS50b0xpc3QgPj4gY3Jvc3MpCiAgICAgCnNvbHZlIDggWzEuLjE2XSAKfD4gU2VxLmxhc3QKfD4gcHJpbnRmbiAiJUEi