递归实现组合型指数型排列型 枚举

Posted tztqwq

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归实现组合型指数型排列型 枚举相关的知识,希望对你有一定的参考价值。

指数型枚举就是枚举子集, 常见的操作是枚举位向量。
如果要枚举一个位向量的子集,刘汝佳有很漂亮的代码, 可以参考。

树形结构可以描述组合, 这个规律必然有更深刻的意义,
甚至可能可以从中总结出很好的思想方法(远超吾辈的傻逼思维), 遗憾呀, 以后再说吧。


//指数型
#include<bits/stdc++.h>
using namespace std;
const int maxn = 16;

int n;
bool S[maxn];

void dfs(int k)
{
    
    if(k == n+1)
    {
        
        for(int i=1; i<=n; ++i) if(S[i]) cout << i << ' ';
        putchar('
');
        return;
        
    }
    
    S[k] = 1;
    dfs(k + 1);
    S[k] = 0;
    dfs(k + 1);
    
}

int main()
{
    
    cin >> n ;
    dfs(1);
    return 0;
    
}

//排列型
#include<bits/stdc++.h>
using namespace std;
const int maxn = 10;

int n;
int Q[maxn];
bool used[maxn];

void dfs(int k)
{
    
    if(k == n+1)
    {
        for(int i=1; i<=n; ++i) cout << Q[i] << ' ' ;
        putchar( '
' );
        return;
    }
    
    for(int i=1; i<=n; ++i) if(!used[i]) {
        used[i] = 1;
        Q[k] = i;
        dfs(k + 1);
        Q[k] = 0;
        used[i] = 0;
    }
    
}

int main()
{
    
    cin >> n;
    dfs(1);
    return 0;
    
}

//组合型
#include<bits/stdc++.h>
using namespace std;
const int maxn = 27;
int n, m;
int Q[maxn];

void dfs(int k, int pre)
{
    if(k == m + 1)
    {
        for(int i=1; i<=m; ++i) cout << Q[i] << ' ' ;
        putchar('
');
        return;
        
    }
    
    for(int i=pre + 1; i<=n-(m-k); ++i)
    {
        Q[k] = i;
        dfs(k+1, i);
    }
    
}

int main()
{
    
    cin >> n >> m;
    dfs(1, 0);
    return 0;
    
}

以上是关于递归实现组合型指数型排列型 枚举的主要内容,如果未能解决你的问题,请参考以下文章

《算法竞赛进阶指南》-AcWing-94. 递归实现排列型枚举-题解

《算法竞赛进阶指南》-AcWing-94. 递归实现排列型枚举-题解

递归与递推一

递归与递推一

三种形式全排列——指数型排列型组合型类型题目汇总

AcWing 92. 递归实现指数型枚举