NOJ 1430 组合的输出 (组合数的排列,两种方法)
来源:互联网 发布:电子元器件查询软件app 编辑:程序博客网 时间:2024/05/22 07:47
组合的输出
时间限制(普通/Java) :1000 MS/ 3000 MS 运行内存限制 : 65536 KByte总提交 : 103 测试通过 : 34
题目描述
排列与组合是常用的数学方法,其中组合就是从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 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
题目来源
JSOI2010题目链接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1430
题目分析:
做法一:DFS直接搜,按顺序找到一组r个数字就输出
#include <cstdio>int n, r, ans[25];void DFS(int num, int step){ ans[step] = num; if(step == r) { for(int i = 1; i <= step; i++) printf("%3d", ans[i]); printf("\n"); return; } for(int i = num + 1; i <= n; i++) DFS(i, step + 1);}int main(){ scanf("%d %d", &n, &r); DFS(0, 0);}
做法二:比法一速度更快,利用STL里的prev_permutation()函数,这个函数可以直接生成前一个排列,非常好用,需要两个数组,一个数组a类似hash的用法,存储总的排列,另一个数组b存储数字,然后不断生成新的排列并输出即可
例如 5 3 则a数组开始为11100,b数组为12345,开始输出123,a数组前一个排列为11010,输出124,以此类推直到00111输出345结束
#include <cstdio>#include <algorithm>using namespace std;int main(){ int n, m, a[25], b[25]; scanf("%d %d", &n, &m); memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); for(int i = 0; i < m; i++) a[i] = 1; for(int i = 0; i < n; i++) b[i] = i + 1; for(int i = 0; i < m; i++) printf("%3d", b[i]); printf("\n"); while(prev_permutation(a, a + n)) { for(int i = 0; i < n; i++) if(a[i]) printf("%3d", b[i]); printf("\n"); }}
0 0
- NOJ 1430 组合的输出 (组合数的排列,两种方法)
- 输出字符串的排列数和组合数
- 组合数的输出
- 数的组合输出
- 输出组合排列的方案
- NOJ 451 光棍节的快乐(组合数+全错位排列)
- C语言中,输出一组数的排列和组合
- 求组合数(取模)的两种方法
- 字符串的排列输出 和组合输出
- 组合数和排列数的关系
- [组合数]求组合数的几种方法总结
- [组合数]求组合数的几种方法总结
- [组合数]求组合数的几种方法总结
- 排列三技巧两码的组合
- NOJ 2033 一页书的书 (组合数+dp)
- PHP输出多个元素的排列排列或组合
- 2种计算组合数的方法
- 计算组合数的几种方法
- Ubuntu 12.04的SWAP设置
- javascript继承
- Service拾遗
- eclipse/myeclipse高亮显示相同变量名
- mpeg4ip.h:126: error: new declaration ‘char* strcasestr(const char*, const char*)’
- NOJ 1430 组合的输出 (组合数的排列,两种方法)
- PowerPC 汇编 — PowerPC 汇编简介
- IaaS私有云解决方案对比分析
- javascript创建对象
- JNDI全面总结
- Bitmap 与 drawable 的区别
- 流媒体协议 之 RTMP
- iOS集成QQ、微信、微博、短信、邮件分享(非第三方集成)
- popcornmaker 下面如何编写一个插件