题目大意:
从1到n中,选r个数字,问选择方案
1<n<21,0<=r<=n
分析:
设函数dfs(dep,now),表示选到数字dep,已经选了now-1个
在函数中确定边界条件,如果当前选的数字大于n,则没必要继续
然后确定可行解条件,如果说now==r+1,表示已经选了r个数字,可以输出
接着确定dep可不可以选,如果不选则回溯,如果选则继续往后选第now个
参考代码:
#include<bits/stdc++.h>
using namespace std;
const int N =25;
int n,r;
int a[N];
void dfs(int dep,int now) { // 选到了数字dep,准备选第now个
if (now==r+1) { // 可行解条件 -> 选完了m个
for (int i=1;i<=r;i++) cout<<setw(3)<<a[i];
cout<<endl;
return;
}
if (dep==n+1) return; // 边界条件
if ((now-1)+(n-dep+1)<r) return;
//把后面全选了都不够m个 剪枝条件 -> 一定无解
//dep选与不选
// 选
a[now]=dep;
dfs(dep+1,now+1); // 往后选第now+1个
a[now]=0; // 回溯 -> 不选
// 不选
dfs(dep+1,now); // 往后继续选第now个
}
int main(){
cin>>n>>r;
dfs(1,1);
return 0;
}