排列组合方案的全输出-------dfs法

实现指数型枚举

在这里插入图片描述

等价于每个整数选与不选,总的方案数就是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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43743711/article/details/111086666