List all possible combinations of k integers between 1…n (n choose k)

后端 未结 4 491
萌比男神i
萌比男神i 2021-02-05 21:42

Out of no particular reason I decided to look for an algorithm that produces all possible choices of k integers between 1...n, where the order amongst the k integer doesn\'t mat

4条回答
  •  终归单人心
    2021-02-05 22:36

    In C++ given the following routine:

    template 
    inline bool next_combination(const Iterator first, Iterator k, const Iterator last)
    {
       /* Credits: Thomas Draper */
       if ((first == last) || (first == k) || (last == k))
          return false;
       Iterator itr1 = first;
       Iterator itr2 = last;
       ++itr1;
       if (last == itr1)
          return false;
       itr1 = last;
       --itr1;
       itr1 = k;
       --itr2;
       while (first != itr1)
       {
          if (*--itr1 < *itr2)
          {
             Iterator j = k;
             while (!(*itr1 < *j)) ++j;
             std::iter_swap(itr1,j);
             ++itr1;
             ++j;
             itr2 = k;
             std::rotate(itr1,j,last);
             while (last != j)
             {
                ++j;
                ++itr2;
             }
             std::rotate(k,itr2,last);
             return true;
          }
       }
       std::rotate(first,k,last);
       return false;
    }
    

    You can then proceed to do the following:

    std::string s = "123456789";
    std::size_t k = 3;
    do
    {
       std::cout << std::string(s.begin(),s.begin() + k) << std::endl;
    }
    while(next_combination(s.begin(),s.begin() + k,s.end()));
    

提交回复
热议问题