#include <array>
#include <bitset>
#include <iostream>
template <std::size_t N>
bool increase(std::bitset<N>& bs)
{
for (std::size_t i = 0; i != bs.size(); ++i) {
if (bs.flip(i).test(i) == true) {
return true;
}
}
return false;
}
template <typename T, std::size_t N>
void print_combinaison(const std::array<T, N>& a)
{
std::bitset<N> bs;
do {
for (std::size_t i = 0; i != N; ++i) {
if (bs.test(i)) {
std::cout << a[i] << " ";
}
}
std::cout << std::endl;
} while (increase(bs));
}
int main()
{
const std::array<int, 5> a {1, 2, 3, 4, 5};
print_combinaison(a);
return 0;
}
I2luY2x1ZGUgPGFycmF5PgojaW5jbHVkZSA8Yml0c2V0PgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTj4KYm9vbCBpbmNyZWFzZShzdGQ6OmJpdHNldDxOPiYgYnMpCnsKICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgIT0gYnMuc2l6ZSgpOyArK2kpIHsKICAgICAgICBpZiAoYnMuZmxpcChpKS50ZXN0KGkpID09IHRydWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTj4Kdm9pZCBwcmludF9jb21iaW5haXNvbihjb25zdCBzdGQ6OmFycmF5PFQsIE4+JiBhKQp7CiAgICBzdGQ6OmJpdHNldDxOPiBiczsKCiAgICBkbyB7CiAgICAgICAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSAhPSBOOyArK2kpIHsKICAgICAgICAgICAgaWYgKGJzLnRlc3QoaSkpIHsKICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCBhW2ldIDw8ICIgIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICAgfSB3aGlsZSAoaW5jcmVhc2UoYnMpKTsKfQoKaW50IG1haW4oKQp7CiAgICBjb25zdCBzdGQ6OmFycmF5PGludCwgNT4gYSB7MSwgMiwgMywgNCwgNX07CiAgICBwcmludF9jb21iaW5haXNvbihhKTsKICAgIHJldHVybiAwOwp9Cg==