组合问题
约 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 个,有几种组合?
登录 后可看答案