You can use recursion. For any given number in the set, find combinations of smaller numbers that are added before the number:
public static IEnumerable<string> GetCombinations(int[] set, int sum, string values) { for (int i = 0; i < set.Length; i++) { int left = sum - set[i]; string vals = set[i] + "," + values; if (left == 0) { yield return vals; } else { int[] possible = set.Take(i).Where(n => n <= sum).ToArray(); if (possible.Length > 0) { foreach (string s in GetCombinations(possible, left, vals)) { yield return s; } } } } }
Using:
int[] set = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; foreach (string s in GetCombinations(set, 18, "")) { Console.WriteLine(s); }
Output:
1,2,4,5,6, 3,4,5,6, 1,2,3,5,7, 2,4,5,7, 2,3,6,7, 1,4,6,7, 5,6,7, 1,2,3,4,8, 2,3,5,8, 1,4,5,8, 1,3,6,8, 4,6,8, 1,2,7,8, 3,7,8, 2,3,4,9, 1,3,5,9, 4,5,9, 1,2,6,9, 3,6,9, 2,7,9, 1,8,9, 1,3,4,10, 1,2,5,10, 3,5,10, 2,6,10, 1,7,10, 8,10,