Вот рекурсивный подход, написанный на Java, подходящий для общего случая:
public static void comb(int[] arr, int m) {
comb(arr, m, 0, new ArrayList<Integer>());
}
public static void comb(int[] arr, int m, int ind, ArrayList<Integer> s) {
int left = m - s.size();
if (left == 0) {
System.out.println(s);
return;
}
if (left > arr.length - ind)
return;
comb(arr, m, ind + 1, s);
s.add(arr[ind]);
comb(arr, m, ind + 1, s);
s.remove(s.size()-1);
}
Он разветвляется каждый раз, когда находит предмет и должен решить, включать его или нет. Существует также оптимизация сокращения для избежания тупиков.