###分析
- 与递归实现排列型枚举不同,递归型组合型枚举 不需要考虑顺序(数字如何排列)
- 本题可使用和递归实现排列型枚举一样的思想:依次枚举每个位置放哪个数
###注意点 - DFS函数参数有两个:当前枚举到的位置(x),当前位置从数字几开始枚举(start)
- 需要一个数组记录每次枚举选了哪些数,最终作为答案
- start:用于记录当前位置从几开始枚举(下一次枚举的起点是该数+1)
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=21;
int n,r;
int answer[N];
void dfs(int x,int start)//x表示当前枚举到了哪个位置,start表示当前位置从几开始枚举
{
if(x>r)
{
for(int i=1;i<=r;++i)
{
printf("%3d",answer[i]);//输出的数不到三位时会自动补足开工
}
cout<<endl;
return ;
}
for(int i=start;i<=n;++i)
{
answer[x]=i;
dfs(x+1,i+1);
answer[x]=0;//恢复现场
}
}
int main()
{
cin>>n>>r;
dfs(1,1);//从第一个位置开始枚举,当前位置从数字"1"开始枚举
return 0;
}