递归实现指数型枚举

【题目描述】
从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案

【输入格式】
输入一个整数n

【输出格式】
每行输出一种方案

同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开

对于没有选任何数的方案,输出空行

本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意

【数据范围】
1 ≤ n ≤ 15

在这里插入图片描述
【题目分析】
由题意可知,输出需要是升序排列,从1~n呢每一个数都有2种可能,可以要它也可以不要它,所以总共的方案数量就是2的n次方,时间复杂度是o(2的n次方*n)
以2个数用递归思想举例:
在这里插入图片描述

边界:最后一个数n为止
从1开始一直到n,再超过n之后会结束,并且每个数都有3个状态,分别为:
<1>还没有轮到,未选定的状态,我们将这个状态定为0
<2>已经被选择要了,这是我们要输出的,我们将这个状态定为1
<3>已经被选择不要了,我们将这个状态定为2

#include <iostream>

using namespace std;
const int N = 20;
int st[N];
void dfs(int a, int b, int st[])
{
    if(a > b) //边界
    {
        for(int i = 1; i <= b ; i++ ) //升序排列
        {
            if(st[i] == 1 ) cout << i << " ";  //1就代表是我们要的,输出就完事了
        }
        cout << endl; //刚好可以多输出一个空行
        return ; //一定要return 不然无休无止了
    }
    st[a] = 1; //假设选择要
    dfs(a+1, b, st);  //下一位数
    
    st[a] = 2;  //假设选择不要
    dfs(a+1, b, st);
}
int main()
{
    int n;
    cin >> n;
    dfs(1, n, st);
    return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

诺比诺比哒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值