实现指数型枚举
等价于每个整数选与不选,总的方案数就是2^n种
// 递归版本
# include <iostream>
# include <vector>
# include <string>
using namespace std;
vector<int> q;
void dfs(int i,int n){
if(i == n+1){
//边界
for(auto i:q){
cout<<i<<' ';
}cout<<endl;
return ;
}
dfs(i+1,n); //不选
q.push_back(i);
dfs(i+1,n); //选
q.pop_back(); //还原现场
return ;
}
int main(void)
{
int n;
cin>>n;
dfs(1,n);
return 0;
}
//非递归版本
# include <iostream>
# include <vector>
# include <string>
using namespace std;
vector<int> q;
void func(int n){
for(int i=0;i<(1<<n);++i){
for(int j=0;j<n;++j){
if(i&(1<<j)) cout<<j+1<<' ';
}
cout<<endl;
}
}
int main(void)
{
int n;
cin>>n;
func(n);
return 0;
}
组合方案数
打印n个数中任意m个数的组合
//递归版本
# include <iostream>
# include <vector>
# include <string>
using namespace std;
vector<int> q;
void dfs(int i,int n,int m){
if(q.size() > m || q.size()+(n-i+1) < m) return ; //剪枝
//选择了超过m个数或者即使再选上剩余所有的数也不够m个,就可以提前得知无结果
if(i == n+1){
//边界
for(auto i:q){
cout<<i<<' ';
}cout<<endl;
return ;
}
dfs(i+1,n,m); //不选
q.push_back(i);
dfs(i+1,n,m); //选
q.pop_back(); //还原现场
return ;
}
int main(void)
{
int n,m;
cin>>n>>m;
dfs(1,n,m);
return 0;
}
//非递归版本
# include <iostream>
# include <vector>
# include <string>
using namespace std;
vector<int> q;
int lowbit(int kk){
return (-kk) & kk;
}
void func(int n,int m){
for(int i=0;i<(1<<n);++i){
int kk = i;
int sum = 0;
while(kk){
kk -= lowbit(kk);
++sum;
}
if(sum==m){
for(int j=0;j<n;++j){
if(i & (1<<j)) cout<<j+1<<' ';
}
cout<<endl;
}
}
}
int main(void)
{
int n,m;
cin>>n>>m;
func(n,m);
return 0;
}
全排列
打印n个数的全排列
# include <bits/stdc++.h>
using namespace std;
int a[1000],book[1000];
void dfs(int step,int sum){
if(step==sum+1) {
// 这里还可以是某几个数的全排列,比如10个数里,选出5个数的全排序
//if(step==6) 即可
for(int i=1;i<=sum;++i){
cout<<a[i]<<' ';
}cout<<endl;
return ;
}
for(int i=1;i<=sum;++i){
if(book[i]) continue;
book[i] = 1;
a[step] = i;
dfs(step+1,sum);
book[i] = 0;
}
}
int main(void)
{
int n;
cin>>n;
dfs(1,n);
return 0;
}