递归实现组合型枚举


title: 递归实现组合型枚举
date: 2023-12-10 19:52:32
tags: 递归
catgories: 算法进阶指南

—> 传送门

题目大意

从 1 ~ n n n n n n 个整数随机选取 m m m 个,输出所有可能的选择方案

思路

在指数型基础上改一下即可。这里用到了剪枝,在图论当中的运用非常普遍。如果能够及时的发现当前问题是无解的,就不需要到达问题边界才返回结果。如果已经选择了超过 m m m 个数,或者即使再选上剩余所有的数也不够 m m m 个,就可以提前得知当前的问题无解。这样我们一旦进入无解的分支就会立刻返回,时间复杂度也就从 2 n 2^n 2n降低到了 C n m C_n^m Cnm

时间复杂度

C n m C_n^m Cnm

#include
using namespace std;

typedef long long LL;

const int N = 1e5 + 10;
 
pair<string,int> a[N];
int n,m;
vector<int> vec;
void calc(int x)
{
    if(vec.size() > m || vec.size() + (n - x + 1) < m){//剪枝
        return;
    }
    if(x == n + 1){
        for(auto v : vec) cout << v << ' ';
        cout << endl;
        return;
    }
    vec.push_back(x);
    calc(x + 1);//选
    vec.pop_back();//还原现场
    calc(x + 1);//不选
}
int main()
{
    cin >> n >> m;
    calc(1);
	return 0;
} 

你可能感兴趣的:(算法竞赛,算法)