Description
找出从自然数1、2、……、m中任取k个数的所有组合,组合中字典序大的先输出。
例如m=5,k=3,应输出
1 2 3
1 2 4
1 2 5
1 3 4
1 3 5
1 4 5
2 3 4
2 3 5
2 4 5
3 4 5
输入格式
两个整数m和k,(1<=k<=m<=10)
输出格式
正序输出所有组合
#include <iostream>
using namespace std;
int ans[105],n,m;//n是总共多少个数,m是要取多少个数
void dfs(int cur,int step)
{
if(step==m+1)//这一次将不取数,直接按顺序输出这一条线下取过的数
{
for(int i=1;i<=m;i++)
cout<<ans[i]<<' ';
cout<<endl;
return;
}
for(int i=cur;i<=n;i++)/*该次for循环代表同一个根结点下同一层
所有数,通过i++来实现在同一层中切换子结点
*/
{
ans[step]=i;//将这次取的数记录下来
dfs(i+1,step+1);//向下取同一条线上未出现过的数
}
}
int main()
{
cin>>n>>m;
dfs(1,1);//函数开始取1(cur),这将是我第一次取数(step)
return 0;
}
解释
函数中的for循环i++实际就是在同一层中切换我们选取的数,如上图1 2 3 间切换
图片中蓝色边框所有节点就是我们所说的同一条线的所有节点