组合型枚举和排列型枚举
一.组合型枚举
1.给两个数字n和m,从1-n中取m个数字的所有情况
方法1:用到了dfs搜索,深度优先搜索每条路径。
//组合形式枚举 //只用组合不用排列 #include<iostream> using namespace std; int n,m; int path[50]; int cnt=0; //path用来储存当前路径上的数字 void dfs(int u,int start) { if(u>m) { for(int i=1;i<=m;i++) { cout<<path[i]<<" "; } cout<<endl; cnt++; return; } for(int i=start;i<=n;i++) { path[u]=i; dfs(u+1,i+1); //用递归依次往下取 } } int main() { cin>>n>>m; dfs(1,1); cout<<cnt<<endl; return 0; }
方法2:每个数字都分为选和不选两种情况。
#include<iostream> #include<vector> using namespace std; vector<int>chose; int n,m; void ser(int x ) { if(chose.size()>m||chose.size()+(n-x+1)<m) //剪枝 return;//若选择的数超过范围或者已选的和剩下的加在一起不到m //则不能满足题意,返回。 if(x>n) //到底再输出 { for(int i=0;i<chose.size();i++) cout<<chose[i]; cout<<endl; return; } chose.push_back(x);//第x个数选 ser(x+1);//进入下一层 chose.pop_back();//第x个数不选 ser(x+1);//进入下一层 } int main() { cin>>n>>m; ser(1);//从第1个数开始 }