递归实现指数型枚举
给出一个集合的所有子集
题目链接:https://www.acwing.com/activity/content/problem/content/1545/1/
//学会画递归搜索树
#include<iostream>
#include<cstdio>
using namespace std;
int st[20],n;
void dfs(int u){ //0表示在考虑,1选,2表示不选
if(u>n){
for(int i=1;i<=n;i++){
if(st[i]==1)
printf("%d ",i);
}
printf("\n");
return;
}
st[u]=2;//不选
dfs(u+1);
st[u]=0; //恢复现场
st[u]=1;//选
dfs(u+1);
st[u]=0;//恢复现场
}
int main(){
cin>>n;
dfs(1);
return 0;
}
递归实现排列型枚举
题目链接:https://www.acwing.com/activity/content/problem/content/1548/1/
#include<cstdio>
#include<algorithm>
#include<string>
using namespace std;
int n, state[10];
bool vis[10];
//递归最重要的是顺序
void dfs(int u){
if(u>n){
for(int i=1;i<=n;i++)
printf("%d ",state[i]);
puts("");
return ;
}
for(int i=1;i<=n;i++)
{
if(!vis[i]){
state[u]=i;
vis[i]=1;
dfs(u+1);
state[u]=0;//恢复现场
vis[i]=0;
}
}
}
int main(){
scanf("%d",&n);
dfs(1);
return 0;
}
递归实现组合型枚举
题目链接:https://www.acwing.com/activity/content/problem/content/1547/1/
#include<algorithm>
#include<cstdio>
#include<iostream>
using namespace std;
const int N=30;
int st[N],n,m;
void dfs(int u, int start){
if(u>m){
for(int i=1;i<=m;i++)
printf("%d ",st[i]);
puts("");
return ;
}
for(int i=start;i<=n;i++){
st[u]=i;
dfs(u+1,i+1); //i+1确定一种升序结构,避免挑选时出现 123 132 321
st[u]=0;
}
}
int main(){
scanf("%d%d",&n,&m);
dfs(1,1);
return 0;
}