#include <iostream>
#include <map>
#include <vector>
using namespace std;
vector<vector<int>> fun(int pos, int n, int k, vector<int> &a) {
if (pos == n || k == 0) {
return {};
}
vector<vector<int>> ret;
//include current element("pos") to the combinations
auto v = fun(pos + 1, n, k - 1, a);
for (auto c: v) {
vector<int> cur = {a[pos]};
//appends vector c to cur
cur.insert(cur.end(), c.begin(), c.end());
ret.push_back(cur);
}
if (k == 1) {
ret.push_back({a[pos]});
}
//exclude current element("pos") from the combinations
auto f = fun(pos + 1, n, k, a);
//appends all vectors returned by f to the current result
ret.insert(ret.end(), f.begin(), f.end());
return ret;
}
int main() {
vector<int> a = {1, 2, 3, 4, 5};
int n = a.size(), k = 3;
auto res = fun(0, n, k, a);
for (auto v: res) {
for (auto x: v) {
cout << x << " ";
}
cout << "\n";
}
cout << "Total number of " << k << "-combinations of " << n << "-elements set: " << res.size() << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWFwPiAKI2luY2x1ZGUgPHZlY3Rvcj4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnZlY3Rvcjx2ZWN0b3I8aW50Pj4gZnVuKGludCBwb3MsIGludCBuLCBpbnQgaywgdmVjdG9yPGludD4gJmEpIHsKCWlmIChwb3MgPT0gbiB8fCBrID09IDApIHsKCQlyZXR1cm4ge307Cgl9Cgl2ZWN0b3I8dmVjdG9yPGludD4+IHJldDsKCS8vaW5jbHVkZSBjdXJyZW50IGVsZW1lbnQoInBvcyIpIHRvIHRoZSBjb21iaW5hdGlvbnMKCWF1dG8gdiA9IGZ1bihwb3MgKyAxLCBuLCBrIC0gMSwgYSk7Cglmb3IgKGF1dG8gYzogdikgewoJCQl2ZWN0b3I8aW50PiBjdXIgPSB7YVtwb3NdfTsKCQkJLy9hcHBlbmRzIHZlY3RvciBjIHRvIGN1cgoJCQljdXIuaW5zZXJ0KGN1ci5lbmQoKSwgYy5iZWdpbigpLCBjLmVuZCgpKTsKCQkJcmV0LnB1c2hfYmFjayhjdXIpOwoJfQoJaWYgKGsgPT0gMSkgewoJCXJldC5wdXNoX2JhY2soe2FbcG9zXX0pOwoJfQoJLy9leGNsdWRlIGN1cnJlbnQgZWxlbWVudCgicG9zIikgZnJvbSB0aGUgY29tYmluYXRpb25zCglhdXRvIGYgPSBmdW4ocG9zICsgMSwgbiwgaywgYSk7CgkvL2FwcGVuZHMgYWxsIHZlY3RvcnMgcmV0dXJuZWQgYnkgZiB0byB0aGUgY3VycmVudCByZXN1bHQKCXJldC5pbnNlcnQocmV0LmVuZCgpLCBmLmJlZ2luKCksIGYuZW5kKCkpOwoJcmV0dXJuIHJldDsKfQoKaW50IG1haW4oKSB7Cgl2ZWN0b3I8aW50PiBhID0gezEsIDIsIDMsIDQsIDV9OwoJaW50IG4gPSBhLnNpemUoKSwgayA9IDM7CglhdXRvIHJlcyA9IGZ1bigwLCBuLCBrLCBhKTsKCWZvciAoYXV0byB2OiByZXMpIHsKCQlmb3IgKGF1dG8geDogdikgewoJCQljb3V0IDw8IHggPDwgIiAiOwoJCX0gCgkJY291dCA8PCAiXG4iOwoJfQoJY291dCA8PCAiVG90YWwgbnVtYmVyIG9mICIgPDwgayA8PCAiLWNvbWJpbmF0aW9ucyBvZiAiIDw8IG4gPDwgIi1lbGVtZW50cyBzZXQ6ICIgPDwgcmVzLnNpemUoKSA8PCBlbmRsOwoJcmV0dXJuIDA7Cn0=