通过从数组中取 k no: of items 来创建所有可能的组合,其中 n no: of items in C++

问题描述

我正在寻找一种方法来插入长度为 n 的数组并获得长度为 k 的所有可能组合。元素可以重复。

如果数组中元素的个数=n,样本大小=k,则可能组合的个数为(n)^k。


例如如果数组是 [a,b,c] 并且 k=2,那么可能的组合应该是 aa,ab,ac,bb,ba,bc,cc,ca,cb.组合数为 (3)^2=9


  1. 如何使用函数 std::vector
  2. 创建动态数组
  3. 如何获得所有可能的组合?

我是编程新手,希望您能解释一下。提前致谢!

解决方法

硬编码解决方案是:

for (int a1 : v) {
  for (int a2 : v) {
    for (int a3 : v) {
      for (int a4 : v) {
        for (int a5 : v) {
            do_job(a1,a2,a3,a4,a5);
        }
      }
    }
  }
}

您可以使用以下通用方式(将所有 a 放入向量中):

bool increase(std::size_t n,std::vector<std::size_t>& its)
{
    for (auto rit = its.rbegin(); rit != its.rend(); ++rit) {
        ++*rit;
        if (*rit >= n) {
            *rit = 0;
        } else {
            return true;
        }
    }
    return false;
}

template <typename F,typename C>
void iterate(F f,const C& v,std::size_t k)
{
    std::vector<std::size_t> it(k,0);
 
    do {
        f(v,it);
    } while (increase(v.size(),it));
}

Live Demo