递归实现指数型枚举
#include<bits/stdc++.h>
using namespace std;
int n;
int ans[20],idx;
void dfs(int u){
if(u>n){
for(int i=0;i<idx;i++)cout<<ans[i]<<" ";
cout<<endl;
return;
}
//选
ans[idx++]=u;
dfs(u+1);
--idx;
//不选
dfs(u+1);
}
int main(){
cin>>n;
dfs(1);
return 0;
}
递归实现组合型枚举
该问题相比上一个问题多出了一个限制,必须选m个。
同样的,从1到n遍历,每一个数可选或不选。在遍历完所有的数并且选了n个数输出即可。
剪枝:
- 当选的数超过了m,直接return。
- 当剩下的数全选都无法选全m个数,直接return。
#include<bits/stdc++.h>
using namespace std;
int n,m;
int ans[30],idx;
void dfs(int u,int cnt){
if(n-u+1+cnt<m)return;
if(cnt==m){
for(int i=0;i<idx;i++)cout<<ans[i]<<" ";
cout<<endl;
return;
}
//选
ans[idx++]=u;
dfs(u+1,cnt+1);
idx--;
//不选
dfs(u+1,cnt);
}
int main(){
cin>>n>>m;
dfs(1,0);
return 0;
}
递归实现排列型枚举
该问题要求我们选出所有的排列,我们可以枚举每一位选择哪个数。用一个数组来表示某个数是否被选。
#include<bits/stdc++.h>
using namespace std;
int n;
int st[10];
int ans[10];
void dfs(int u){
if(u>n){
for(int i=1;i<=n;i++)cout<<ans[i]<<" ";
cout<<endl;
return;
}
for(int i=1;i<=n;i++){
if(st[i])continue;
ans[u]=i;
st[i]=1;
dfs(u+1);
st[i]=0;
}
}
int main(){
cin>>n;
dfs(1);
return 0;
}