引入题目来分析:
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)输出格式
按字典序输出所有组合输入样例
5 2输出样例
1 2 1 3 1 4 1 5 2 3 2 4 2 5 3 4 3 5 4 5
也很容易观察出来,要借用递归的方法来实现;
那么原理是什么那?如何实现呢?这里是我们需要解决的问题。
我画了一张图来帮助理解;
实现代码如下:
//递归实现组合
#include <iostream>
using namespace std;
int st[10000];
int m,k;
void dfs(int index,int start){ //index 为层数,start 为开始的数字
if(index>k){ //取够 进行打印
for(int i=1;i<=k;i++){
cout<<st[i]<<" ";
}
cout<<endl;
}else{
for(int i=start;i<=m;i++){
st[index] = i;
dfs(index+1,i+1);
st[index] = 0; //回溯
}
}
}
int main(){
cin>>m>>k; //m 为数字的个数,k为 间隔
dfs(1,1); // dfs(u,start),u 为层数
}
太奇妙了。。