递归与枚举 CH0301 CH0302 CH0303

本文探讨了如何使用递归方法解决三种不同的枚举问题:指数型枚举,从n个数中选择多个;排列型枚举,从n个数中选择m个进行排列;以及全排列问题,对n个整数进行所有可能的排序。通过DFS(深度优先搜索)策略,可以生成所有可能的组合和排列,每种情况分别对应2^n、n!种解。
摘要由CSDN通过智能技术生成

1.递归实现指数型枚举

从1——n这n(n<20)个数中随机选取任意多个。输出所有可能的方案,

等价于每个整数可以选或者不选,所有的方案为2^n种,DFS思想,选与不选,选了之后要回溯

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <cmath>
using namespace std;
const int MAXN=1e4+5;
int n;
vector<int> chosen; //被选择的数
void calc(int x)
{
    if(x==n+1){
        for(int i=0;i<chosen.size();i++)
            printf("%d ",chosen[i]);
       printf("\n");
        return ;
    }
    //不选x
    calc(x+1); //求解子问题
    //选x
    chosen.push_back(x); //记录x被记录
    calc(x+1);  //求解子问题
    chosen.pop_back();//还原
}

int main()
{
    scanf("%d",&n);
    calc(1);
}

2.递归实现排列型枚举

从1——n这n个整数中随机选出m(0<=m<=n<20)个,,输出所有可能的方案


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值