nyoj 32-组合数(DFS)
2014-01-08 21:45
274 查看
http://acm.nyist.net/JudgeOnline/problem.php?pid=32
时间限制:3000 ms | 内存限制:65535 KB
难度:3
描述找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
输入输入n、r。
输出按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入
样例输出
组合数
时间限制:3000 ms | 内存限制:65535 KB难度:3
描述找出从自然数1、2、... 、n(0<n<10)中任取r(0<r<=n)个数的所有组合。
输入输入n、r。
输出按特定顺序输出所有组合。
特定顺序:每一个组合中的值从大到小排列,组合之间按逆字典序排列。
样例输入
5 3
样例输出
543 542 541 532 531 521 432 431 421 321
#include<iostream> using namespace std; int a[100]; void group(int m, int k) { for (int i = m; i >= k; i--) { a[k] = i; //先添加 if (k > 1) group(i - 1, k - 1); // else { for (int j = a[0]; j > 0; j--) cout << a[j]; cout << endl; } } } int main() { int m, k; cin >> m >> k; // 5 3 a[0] = k; //输出的位数 group(m, k); }
#include<iostream> #include<cstring> using namespace std; int a[12]; bool visit[12]; void DFS(int x, int cur, int deep) { //入口、当前层、总层数 if (cur > deep) return; //结束条件 for (int i = x; i >= 1; i--) { //尝试将 i插入到 a[cur] if (!visit[i]) { visit[i] = true; a[cur] = i; if (cur == deep) { for (int i = 1; i <= deep; i++) cout << a[i]; cout << endl; } DFS(i - 1, cur + 1, deep); visit[i] = false; } } } int main() { int m, n; while (cin >> m >> n) { memset (visit, false, sizeof(visit)); DFS(m, 1, n); } }
相关文章推荐
- 有理数类
- Class.newInstance()学习
- 【一些事晚报】薪资大比拼 12306的互联网思维 京东和腾讯在一起
- AJAX和form表单提交的中文转码问题全面解决,encoderURL两次转码的真相
- vim代码补全
- 黑马程序员_09_多态的演变过程
- How to Defeat Windows 8 ASLR in Getting the Address of KPCR
- WIFI基本知识
- 程序员面试题精选100题(27)-二元树的深度[数据结构]
- db file sequential read等待事件
- android libaray的创建和使用
- SB新态
- 面试题:求最小的K个数。
- Opencv2.1+vs2008生成不依赖编译环境的exe文件
- typedef int (init_fnc_t) (void)和typedef int (*init_fnc_t) (void) 区别
- 概要设计说明书——机房收费系统
- 黑马程序员-------第一天
- MCU封装简介
- 两个不同网关电脑互 ping
- 专家解读黄牛抢票原理:免验证码 免个人信息