import Data.List
cal :: [Int] -> Int -> [[Int]]
cal xs 0 = [[]]
cal xs s = if sum xs < s then [] else nub $ map sort $ concat [ map (x:) $ cal (delete i ys) (s - x) | (x, i) <- zip ys [0..] ]
where ys = [ x | x <- xs, x <= s ]
main = do
putStrLn $ show $ cal [10, 1, 2, 7, 6, 1, 5] 8
putStrLn $ show $ cal [2, 5, 2, 1, 2] 5
putStrLn $ show $ cal [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 27