问题描述
我正在寻找一种方法来插入长度为 n 的数组并获得长度为 k 的所有可能组合。元素可以重复。
如果数组中元素的个数=n,样本大小=k,则可能组合的个数为(n)^k。
例如如果数组是 [a,b,c] 并且 k=2,那么可能的组合应该是 aa,ab,ac,bb,ba,bc,cc,ca,cb.组合数为 (3)^2=9
- 如何使用函数 std::vector 创建动态数组
- 如何获得所有可能的组合?
我是编程新手,希望您能解释一下。提前致谢!
解决方法
硬编码解决方案是:
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));
}