zoukankan      html  css  js  c++  java
  • C++组合数(combination)的实现

    实现:

    (nm)

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

    1. 递归实现

    // picked + toPick == m
    void 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 1
    0 2
    0 3
    1 2
    1 3
    2 3

    也即,

    • 0 先进数组,1 再进数组 ⇒ toPick == 0, 输出 (0, 1)
    • 1 出数组,2 进数组 ⇒ toPick == 0, 输出 (0, 2)
    • 2 出数组,3 进数组 ⇒ toPick == 0, 输出 (0, 3)
    • 3 出数组,0 出数组 ⇒ next ⇒ 1
  • 相关阅读:
    联赛膜你测试20 T1 Simple 题解 && NOIP2017 小凯的疑惑 题解(赛瓦维斯特定理)
    P5518
    快速除法 / 取模
    P6860
    spoj LCMSUM
    虚树 学习笔记
    长链剖分 学习笔记
    CF526G
    P4292
    01 分数规划(water)
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9423899.html
Copyright © 2011-2022 走看看