组合问题

10 分钟

排列讲顺序,1 2 和 2 1 算两种;组合不讲顺序,只算一种。列组合时,只要规定每一层都从"上一个选中的数之后"往后挑,天然就不会出现重复。

void dfs(int start, int cnt, int n, int k) { // 从 start 起挑第 cnt 个
    if (cnt == k) { 输出; return; }
    for (int i = start; i <= n; i++) {
        chosen[cnt] = i;
        dfs(i + 1, cnt + 1, n, k);   // 下一层从 i+1 起,保证递增
    }
}

关键就在下一层传的是 i + 1 而不是 1——这保证选出的数严格递增。从 3 个数里选 2 个只会得到 (1,2)、(1,3)、(2,3),共 种,不重不漏。

小纸条

从 3 个数里选 2 个,有几种组合?

登录 后可看答案

组合问题 · 考级冲刺 · op599 课程