「从 n 个数里选 k 个」的组合搜索(相当于食堂 n 样菜里挑 k 样,只看挑了哪几样、不看顺序),比全排列模板只多了一个参数:
void dfs(int pos, int start) { // 填第 pos 位,候选从 start 号起
if (pos == k + 1) { /* 输出方案 */ return; }
for (int num = start; num <= n; num++) {
path[pos] = num;
dfs(pos + 1, num + 1); // 下一位只能选 num 之后的
}
}
参数 start 的作用是( )
- A. 记录当前已经选了几个数
- B. 记录当前方案里最小的数,输出时要用
- C. 限定本层的候选只能从 start 号起往后取,保证后填的数一定比先填的大
- D. 控制递归层数,防止无限递归