Search code examples
c++algorithmcombinations

Generating combinations in C++


I have been searching for a source code for generating combinations using C++. I found some advanced codes for this but that is good for only specific number predefined data. Can anyone give me some hints, or perhaps, some ideas to generate a combination?

As an example, suppose the set S = { 1, 2, 3, ...., n} and we pick r= 2 out of it. The input would be n and r. In this case, the program will generate arrays of length two. So input of 5 2 would output 1 2, 1 3.

I had difficulty in constructing the algorithm. It took me a month to think about this.


Solution

  • A simple way using std::next_permutation:

    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    int main() {
        int n, r;
        std::cin >> n;
        std::cin >> r;
    
        std::vector<bool> v(n);
        std::fill(v.end() - r, v.end(), true);
    
        do {
            for (int i = 0; i < n; ++i) {
                if (v[i]) {
                    std::cout << (i + 1) << " ";
                }
            }
            std::cout << "\n";
        } while (std::next_permutation(v.begin(), v.end()));
        return 0;
    }
    

    or a slight variation that outputs the results in an easier to follow order:

    #include <iostream>
    #include <algorithm>
    #include <vector>
    
    int main() {
       int n, r;
       std::cin >> n;
       std::cin >> r;
    
       std::vector<bool> v(n);
       std::fill(v.begin(), v.begin() + r, true);
    
       do {
           for (int i = 0; i < n; ++i) {
               if (v[i]) {
                   std::cout << (i + 1) << " ";
               }
           }
           std::cout << "\n";
       } while (std::prev_permutation(v.begin(), v.end()));
       return 0;
    }
    

    A bit of explanation:

    It works by creating a "selection array" (v), where we place r selectors, then we create all permutations of these selectors, and print the corresponding set member if it is selected in in the current permutation of v.