递归实现组合型枚举

从 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

图解

在排列基础上维护正序即可确保方案不重复

Code

点击查看代码
#include<iostream>
using namespace std;
int n,m;
bool st[20]; //是否选过
int ways[20]; //保存方案 void dfs(int x){ //选到第x位//前一位是start
if(x > m){ //选到第m+1位,即得到一种方案
for(int i = 1; i <= m; i ++ ){ //输出方案
cout << ways[i] << " ";
}
puts("");
return ; //注意要退出
} for(int i = ways[x - 1] + 1; i <= n; i ++ ){ //从前一位的下一位开始枚举枚举每一位
if(!st[i]){ //如果没选过
st[i] = 1;
ways[x] = i; //选i
dfs(x + 1); //选下一位
ways[x] = 0; //恢复现场
st[i] = 0;
}
}
} int main(){
cin >> n >> m;
dfs(1); //从第一位开始选//前一位是0
}

优化

  1. 方法:剪枝
  2. 优化前:160ms左右,优化后:40ms左右
点击查看代码
#include<iostream>
using namespace std;
int n,m;
bool st[20];
int ways[20]; void dfs(int x){
if(ways[x - 1] + (m - x + 1) > n)return; //优化
//ways[x - 1]表示上一位枚举的是什么
//m - x + 1标志还有多少位要枚举
//ways[x - 1] + (m - x + 1) > n表示如果全部正序枚举完后所需要的最大数大于n提前退出递归
if(x > m){
for(int i = 1; i <= m; i ++ ){
cout << ways[i] << " ";
}
puts("");
return ;
} for(int i = ways[x - 1] + 1; i <= n; i ++ ){
if(!st[i]){
st[i] = 1;
ways[x] = i;
dfs(x + 1);
ways[x] = 0;
st[i] = 0;
}
}
} int main(){
cin >> n >> m;
dfs(1);
}

C组合方案的更多相关文章

  1. IM推送保障及网络优化详解(二):如何做长连接加推送组合方案

    对于移动APP来说,IM功能正变得越来越重要,它能够创建起人与人之间的连接.社交类产品中,用户与用户之间的沟通可以产生出更好的用户粘性. 在复杂的 Android 生态环境下,多种因素都会造成消息推送 ...

  2. 基于VC++ Win32+CUDA+OpenGL组合与VC++ MFC SDI+CUDA+OpenGL组合两种方案的遥感影像显示:获得的重要结论!

    1.基于VC++ Win32+CUDA+OpenGL组合的遥感影像显示 在该组合方案下,初始化时将OpenGL设置为下面两种方式,效果一样 //设置方式1 glutInitDisplayMode (G ...

  3. noi 2985 数字组合

    题目链接: http://noi.openjudge.cn/ch0206/2985/ 2985:数字组合 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描述 有n个正 ...

  4. 腾讯笔试题:小Q硬币组合

    腾讯有一道机试题: 大概意思是: 小Q非常富有,拥有非常多的硬币,小Q的拥有的硬币是有规律的,对于所有的非负整数K,小Q恰好> 各有两个数值为2^k,的硬币,所以小Q拥有的硬币是1,1,2,2, ...

  5. 砝码组合(dfs)

    砝码组合  题目内容:用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量.如果只有5个砝码,重量分别是1,3,9,27,81.则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两 ...

  6. 【专题】计数问题(排列组合,容斥原理,Prufer序列)

    [容斥原理] 对于统计指定排列方案数的问题,一个方案是空间中的一个元素. 定义集合x是满足排列中第x个数的限定条件的方案集合,设排列长度为S,则一共S个集合. 容斥原理的本质是考虑[集合交 或 集合交 ...

  7. 2019牛客暑期多校训练营(第九场)E.All men are brothers(并查集+排列组合)

    题意:现在有n个集合 每个集合大小为1 现在你可以把集合合并m次 每次会告诉你哪个集合合并 让你输出每次从不同的四个集合里各选出四个的组合方案 思路:我们可以想到用并查集模拟集合的合并 对于方案数 我 ...

  8. [组合][DP]luogu P3643 [APIO2016]划艇

    题面 https://www.luogu.com.cn/problem/P3643 对于一个序列,第i项可取的值在{0}∪[ai,bi]之间,求使序列非零部分单调递增的方案数 分析 设 $f[i][j ...

  9. Bugtags 创业一年总结

    出发 在经历过了多轮的 APP 开发/测试/上线/运营周期之后,我们觉得 APP Bug 反馈环节始终十分低效,我们要来改变一下这个状态.于是有了 bugtags.com. 一年 从去年六月正式立项, ...

随机推荐

  1. jsp页面中怎么利用a标签的href进行传递参数以及需要注意的地方

    jsp页面中: <a href="${pageContext.request.contextPath }/infoController/getProductInfo?productId ...

  2. 驱动开发:内核枚举LoadImage映像回调

    在笔者之前的文章<驱动开发:内核特征码搜索函数封装>中我们封装实现了特征码定位功能,本章将继续使用该功能,本次我们需要枚举内核LoadImage映像回调,在Win64环境下我们可以设置一个 ...

  3. 齐博x2模型里边钩子的创建与使用

    在模型里边的钩子创建与使用方法跟在控制器里边的钩子创建及使用方法是有所区别的在模型里边创建的钩子,你可以理解为执行一个函数,是无法调用模型里边的类的方法及属性的.比如系统文件\application\ ...

  4. 表驱动法在STM32中的应用

    1.概念 所谓表驱动法(Table-Driven Approach)简而言之就是用查表的方法获取数据.此处的"表"通常为数组,但可视为数据库的一种体现.根据字典中的部首检字表查找读 ...

  5. jvm之垃圾收集一之垃圾回收算法

    最近又重新在读深入理解java虚拟机一书,吸取第一次读完到现在已经忘记的差不都的教训,这次的学习之旅想通过博客的形式记录下自己的所学所感,以备后续继续学习备忘所用!这次先记录下垃圾收集相关知识点: 垃 ...

  6. .NET应用开发之SQLServer常见问题分析

    日常我们开发.NET应用时会使用SQLServer数据库,对于SQLServer数据库的日常开发有一些技能和工具,准备给大家分享一下. 一.场景1:SQLServer死锁分析  执行以下SQL,启用S ...

  7. SolidEdge ST8安装教程

    SolidEdge ST8安装教程: 1.使用百度云客户端下载Solidedge ST8软件安装包,打开软件安装文件夹: 2.选择.ISO安装文件,打开.ISO安装文件,可以解压或使用虚拟光驱加载: ...

  8. java 分布式游戏服务器框架,集群游戏服务器框架,游戏服务器网关框架 ioGame 网络游戏服务器框架

    ioGame 国内首个基于蚂蚁金服 SOFABolt 的 java 网络游戏服务器框架:无锁异步化.事件驱动的架构设计 通过 ioGame 可以很容易的搭建出一个集群无中心节点.有状态多进程的分步式游 ...

  9. Web安全Day1 - SQL注入、漏洞类型

    Web安全Day1 - SQL注入.漏洞类型 1. SQL注入 1.1 漏洞简介 1.2 漏洞原理 1.3 漏洞危害 2. SQL漏洞类型 2.1 区分数字和字符串 2.2 内联SQL注入 2.3 报 ...

  10. 云原生学习笔记-1-docker

    一.基础环境说明 1.操作系统:Centos7.6:1master:2node 2.docker版本:docker-ce 19.03.8-3 二.docker安装 1.使用阿里镜像仓库,mirror. ...