普通枚举 普通指数级枚举 :blue_heart: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647#include<bits/stdc++.h>using namespace std;const int N=20;int n;int st[N]; //0还没有选择 1选择 2不选void dfs(int c){ //终止条件 if(c>n) { for(int i=1;i<=n;i++) { if(st[i]==1) //被选中了 cout<<i<<" "; } cout<<endl; return ; } st[c]=2; dfs(c+1); st[c]=0; st[c]=1; dfs(c+1); st[c]=0; }int main(){ cin>>n; dfs(1); return 0;} 输出结果: 输入 3 输出 12345673 2 2 3 1 1 3 1 2 1 2 3 全排列型枚举 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#include<bits/stdc++.h>using namespace std;const int N=16;bool use[N];int st[N];int n;void dfs(int num) //枚举第num个数字 此时num还没有赋予具体的数值{ if(num>n) { for(int i=1;i<=n;i++) { cout<<st[i]<<" "; } cout<<endl; return ;} for(int i=1;i<=n;i++) { if(use[i]==false) {use[i]=true; //第数字i被用了 st[num]=i; //将数字i赋值于 num(枚举的一个数字) dfs(num+1); use[i]=false; st[num]=0; }//恢复现场 } } int main(){ cin>>n; dfs(1);} 输出结果: 输入 3 输出 1234561 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 组合型枚举 字典序升序 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162// 从 1∼n// 这 n// 个整数中随机选出 m 个,输出所有可能的选择方案。 // 输入格式// 两个整数 n,m// ,在同一行用空格隔开。// 输出格式// 按照从小到大的顺序输出所有方案,每行 1个。// 个// 首先,同一行内的数升序排列,相邻两个数用一个空格隔开。// 其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。#include<bits/stdc++.h>using namespace std;const int N=50;int way[N];int n,m;void dfs(int use,int start) //use 指的是当前枚举到哪个位置,start指的是目前从哪个位置开始枚举 即是从最小的位置开始枚举 { //递归结束条件 if(use==m+1) { for(int i=1;i<=m;i++) { cout<<way[i]<<" "; } cout<<endl; return; } for(int i=start;i<=n;i++) { way[use]=i ; //当前枚举到use位置 循环赋值 dfs(use+1,i+1);//继续枚举下一个位置 way[use]=0; //,枚举完一论循环之后 恢复现场 } }int main(){ cin>>n>>m; dfs(1,1);} 输出结果: 输入 5 3 输出 123456789101 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