C++组合数(combination)的实现

来源:互联网 发布:网络信息安全检测 编辑:程序博客网 时间:2024/06/11 08:41

实现:

(nm)

  • 既需要计算组合的总数 (32)=3
  • 也需要分别获得每一种组合的情形,用于穷举搜索;
    • 1, 2; 1, 3; 2, 3

1. 递归实现

// picked + toPick == mvoid comb(int n, vector<int>& picked, int toPick){    if (toPick == 0) { printPicked(picked); return; }    int smallest = picked.empty() ? 0 : picked.back() + 1;    for (int next = smallest; next < n; ++next){        picked.push_back(next);        comb(n, picked, toPick-1);        picked.pop_back();                                // 关键!!!    }}

对于 (42) 而言,四个之中选 2 个,调用端代码如下,

vector<int> picked;             // 开始为空;comb(4, picked, 2);                                // 第一个参数表示 n = 4,第三个参数表示 m=2

最终的输出结果为:

0 10 20 31 21 32 3

也即,

  • 0 先进数组,1 再进数组 ⇒ toPick == 0, 输出 (0, 1)
  • 1 出数组,2 进数组 ⇒ toPick == 0, 输出 (0, 2)
  • 2 出数组,3 进数组 ⇒ toPick == 0, 输出 (0, 3)
  • 3 出数组,0 出数组 ⇒ next ⇒ 1
0 0