递归实现指数型枚举

#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;
}
这篇博客介绍了如何使用递归实现三种类型的枚举算法:指数型枚举、组合型枚举和排列型枚举。在指数型中,从1到n遍历并输出所有可能的组合;组合型枚举要求在n个数中选出m个,通过剪枝避免无效计算;排列型枚举则生成n个数的所有不同排列。每种枚举都给出了相应的C++代码实现。
1672

被折叠的 条评论
为什么被折叠?



