1317:【例5.2】组合的输出

时间限制: 1000 ms         内存限制: 65536 KB
提交数: 21154     通过数: 10292

【题目描述】

排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且r≤n),我们可以简单地将n个元素理解为自然数1,2,…,n,从中任取r个数。

现要求你用递归的方法输出所有组合。

例如n=5,r=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

【输入】

一行两个自然数n、r(1<n<21,1≤r≤n)。

【输出】

所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。

【输入样例】

5 3

【输出样例】

  1  2  31  2  41  2  51  3  41  3  51  4  52  3  42  3  52  4  53  4  5

【分析】

如果不考虑样例输入,只考虑样例输出,使用枚举法,直接可以输出结果。代码如下:

#include <stdio.h>
int main()
{int a,b,c;for(a=1;a<=5;a++)for(b=1;b<=5;b++)for(c=1;c<=5;c++){if(a<b && b<c)printf("%d %d %d\n",a,b,c);}return 0;
}

现在考虑输入,怎么枚举呢?实际上就是3个坑,分别用1~5的数进行填充。第一个坑,可能填充的数自然是1、2、3、4、5开头,由于需要按字典序,所以4和5开头不用考虑,因为不够三个。现在只剩下1、2、3三个数开头。递归解空间树如下:

下面用深搜模板遍历它。需要记录哪些信息?三个坑,三个位置,用数组way[N]记录,递归深度u,即当前枚举哪个位置(第几个坑)?起始位置start,即当前最小可以从哪枚举?

【参考代码】

#include <stdio.h>
#define N 30int n, m;
int way[N];   // 记录路径void dfs(int u, int start)  // 当前枚举的位置u,从start处开始枚举
{int i;if(u+n-start<m)   // 后面的点加起来不足m个,剪枝舍去 return;if(u>m)           // 枚举到叶子结点 {for(i=1;i<=m;i++)printf("  %d",way[i]);printf("\n") ;return;}for(i=start;i<=n;i++)  // 从start开始,逐一进行试探 {way[u]=i;dfs(u+1,i+1);      // 将i放到u位置,递归下一层 ,从i+1开始枚举}
}
int main()
{scanf("%d%d",&n,&m);dfs(1,1);return 0;
}

http://ybt.ssoier.cn:8088/problem_show.php?pid=1317

信息学奥赛一本通(1317:【例5.2】组合的输出)相关推荐

  1. 信息学奥赛一本通(1245:不重复地输出数)

    1245:不重复地输出数 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 5045     通过数: 2583 [题目描述] 输入n个数,从小到大将它们输出,重复的 ...

  2. 信息学奥赛一本通C++语言——1026:空格分隔输出

    [题目描述] 读入一个字符,一个整数,一个单精度浮点数,一个双精度浮点数,然后按顺序输出它们,并且要求在他们之间用一个空格分隔.输出浮点数时保留6位小数. [输入] 第一行是一个字符: 第二行是一个整 ...

  3. 【例1】 0/1背包《信息学奥赛一本通》【解法一】 02

    /* [例1] 0/1背包<信息学奥赛一本通>[解法一] 02 http://ybt.ssoier.cn:8088/problem_show.php?pid=1267 */ #includ ...

  4. 【例8】合唱队形(《信息学奥赛一本通第五版》)

    /* [例8]合唱队形(<信息学奥赛一本通第五版>) http://ybt.ssoier.cn:8088/problem_show.php?pid=1264 [问题描述] N位同学站成一排 ...

  5. 信息学奥赛一本通 2021:【例4.6】最大公约数

    [题目链接] ybt 2021:[例4.6]最大公约数 [题目考点] 1. while循环 2. 求最大公约数 辗转相减法 辗转相除法 [解题思路] 解法1:枚举 取较小数字,从该数字的值开始从大到小 ...

  6. 信息学奥赛一本通(2032:【例4.18】分解质因数)

    2032:[例4.18]分解质因数 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 582     通过数: 376 [题目描述] 把一个合数分解成若干个质因数乘积 ...

  7. 信息学奥赛一本通——2062:【例1.3】电影票

    2062:[例1.3]电影票 时间限制: 1000 ms         内存限制: 65536 KB 提交数: 57341     通过数: 34230 [题目描述] 已知一位小朋友的电影票价是10 ...

  8. 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制

    [题目链接] ybt 1278:[例9.22]复制书稿(book) 洛谷 P1281 书的复制 [题目考点] 1. 动态规划:线性动规 [解题思路] 该题可以抽象为:将由m个数字构成的序列分成k个子段 ...

  9. 信息学奥赛一本通1267:【例9.11】01背包问题(二维dp与滚动数组优化)

    [题目描述] 一个旅行者有一个最多能装 MM 公斤的背包,现在有 nn 件物品,它们的重量分别是W1,W2,...,WnW1,W2,...,Wn,它们的价值分别为C1,C2,...,CnC1,C2,. ...

  10. 信息学奥赛一本通C++语言-----2036:【例5.3】开关门

    [题目描述] 宾馆里有n(2≤n≤1000)n(2≤n≤1000) 个房间,从1∼n1∼n 编了号.第一个服务员把所有的房间门都打开了,第二个服务员把所有编号是22 的倍数的房间"相反处理& ...

最新文章

  1. html文字垂直居中_文字垂直居中
  2. 深信服:输入一个字符串,帮忙统计字符串里面的每个单词出现的次数,以及非法单词的次数。非法单词的定义为:包含数字(0-9)的单词
  3. 【重要】如何彻底夯实CV基础,有三AI三大导师一起带你学习!
  4. IDEA检出SVN项目时提示:Cannot load supportted format:Cannot run program svn
  5. 前端之 XMLHttpRequest
  6. bzoj:2018 [Usaco2009 Nov]农场技艺大赛
  7. Windows命令行(DOS命令)教程
  8. 机器学习 - [集成学习]Bagging算法的编程实现
  9. Unity无缝切换场景
  10. 05 Java 求职简历制作
  11. 虚拟偶像养成记:人工智能人格化与IP化打造出完美“爱豆”
  12. java识别手写文字_Java 实现OCR 识别图像文字(手写中文)----tess4j
  13. sublime 3207 激活
  14. Linux安装iptables防火墙
  15. DES加密解密-java
  16. 输出的字体全部变成繁体字
  17. 程序linux培训,马哥-51CTO-Linux培训-0910-程序包管理
  18. 在线安装rancher2.4管理K8S集群并部署服务
  19. idea maven子项目图标右下角没有小蓝方块
  20. TCP套接口的sk_backlog接收队列

热门文章

  1. android input出现一个多余文本窗口 解决办法
  2. 最大化BEA WebLogic Cluster的性能、可用性和安全
  3. 一文读懂「中台」的前世今生
  4. 猿宵节正确打开方式:你要的大数据、机器学习、神经网络…已配齐
  5. STM32之独立看门狗例程
  6. 一不小心节约了 591 台机器!
  7. 再现暴力裁员!患病员工被关小黑屋,摄像头监控,工作量超其他人!
  8. docker安装xxl-job-admin步骤
  9. Web安全通讯之JWT的Java实现
  10. tomcat 软连接问题