AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

AcWing 93. 递归实现组合型枚举    原题链接    简单

作者: 作者的头像   秦淮岸灯火阑珊 ,  2019-01-18 17:46:21 ,  所有人可见 ,  阅读 11977


37


17

题目描述

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

输入格式
两个整数 n,m ,在同一行用空格隔开。

输出格式
按照从小到大的顺序输出所有方案,每行1个。

首先,同一行内的数升序排列,相邻两个数用一个空格隔开。

其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如1 3 5 7排在1 3 6 8前面)。

数据范围
n>0 ,
0≤m≤n ,
n+(n−m)≤25
输入样例:
5 3
输出样例:
1 2 3 
1 2 4 
1 2 5 
1 3 4 
1 3 5 
1 4 5 
2 3 4 
2 3 5 
2 4 5 
3 4 5 

正解

(搜索)
  • 1.通过上一道题目,我们知道这道题目利用了回溯的性质,也就是深度优先搜索
    2.相比上一道题,本题应该注意的是,我们只需要选择m个数,并不是所有的数
    3.回溯直接可以忽略不记,代码中有体现

C++ 代码

#include <bits/stdc++.h>
using namespace std;
int n,m,p[110];
void dfs(int x)
{
    if (p[0]==m)
    {
        for (int j=1;j<=p[0];j++)
            cout<<p[j]<<" ";
        cout<<endl;
        return ;
    }
    for (int i=x;i<=n;i++)
    {
        p[++p[0]]=i;
        dfs(i+1);
        p[p[0]--]=0;
    }
}
int main()
{
    cin>>n>>m;
    dfs(1);
    return 0;
}

正解二

#include <bits/stdc++.h>
using namespace std;
int n,m,p[110];
void dfs(int x)
{
    if (p[0]==m)
    {
        for (int i=1;i<=p[0];i++)
            cout<<p[i]<<" ";
        cout<<endl;
        return ;
    }
    if (x==n+1)
        return ;
    p[++p[0]]=x;
    dfs(x+1);
    p[p[0]--]=0;
    dfs(x+1);
}
int main()
{
    cin>>n>>m;
    dfs(1);
}

正解三 位运算

#include <bits/stdc++.h>
using namespace std;
int n,m;
void dfs(int x,int now,int date)
{
    if (x>n || date+(n-x+1)<m)
        return ;
    if (date==m)
    {
        for (int i=1;i<=n;i++)
            if (now>>(i-1) & 1)
               cout<<i<<" ";
        puts("");
        return ;
    }
    dfs(x+1,now+(1<<x),date+1);
    dfs(x+1,now,date);
}
int main()
{
    cin>>n>>m;
    dfs(0,0,0);
}

17 评论


用户头像
markchen   2021-04-19 10:07      8    踩      回复

大…大佬…,我看了20年终于看懂了0.0


用户头像
asseg   2022-12-12 10:20      1    踩      回复

为什么第一个是i+1呀,不可以x+1吗


用户头像
又认不清自己了   2024-03-21 20:49         踩      回复

大佬DFS的时间复杂度为多少?求解


用户头像
图灵酱   2023-12-19 15:39         踩      回复

那个时候佬还是个初中生呢


用户头像
快乐番薯   2023-08-03 22:05         踩      回复

位运算的x>n为什么不是x==n


用户头像
ocean6_6   2022-11-17 21:35         踩      回复

hell no。。。看呆了orz


用户头像
M狼   2019-12-07 23:14         踩      回复

‘为什么先选输出顺序就是正序?’有相同的疑问

用户头像
秦淮岸灯火阑珊   2019-12-08 16:59         踩      回复

搜索框架就是这样滴

用户头像
cc_20   2020-02-29 13:47         踩      回复

因为一直不选的话首先dfs到的就是3


用户头像
kimihiki   2019-08-24 13:18         踩      回复

为什么先选输出顺序就是正序?


用户头像
秦淮岸灯火阑珊   2019-04-10 21:53         踩      回复

你之前发过,我看到了,然后点击提交评论,然后就404了,话说我看到了,肯定是会马上回的,不用这么激动辣


用户头像
仙风   2019-04-10 21:03         踩      回复

请问一下大佬, dfs(x+1,now+(1<<x),date+1);,这句话中的(now+(1<<x) )是什么意思呢?
x表示现在正在查找的第x个数, data为 找到的数的个数,那么now应该就是现在找到的数对吗?

用户头像
秦淮岸灯火阑珊   2019-04-10 21:52         踩      回复

是的,其实你用数组存储也是可以的

用户头像
仙风   2019-04-16 20:26    回复了 秦淮岸灯火阑珊 的评论         踩      回复

好的,谢谢大佬。
ps:突然发现自己发了好多重复评论,很尴尬(现在已删除);


用户头像
Lose   2019-02-19 15:55         踩      回复

想死,,真够变态的


用户头像
持之以珩   2019-01-22 23:32         踩      回复

那么,有没有非递归算法

用户头像
秦淮岸灯火阑珊   2019-01-23 16:59         踩      回复

日后补充吧


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息