32 组合数【dfs】
2015-08-09 12:56
204 查看
组合数
时间限制: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
dfs 打印全排列和全组合,是个比较经典的题目,需要用递归的思想进行控制,方法比较多,用标记的方法,也是比较常见的用法.....
比较简单,主要是理解递归的工作原理
#include<stdio.h> #include<string.h> int x[105],y[105],vis[105],n,r; void dfs(int v) { if(v>=r) { for(int i=0;i<r;++i) { printf("%d",x[i]); } printf("\n"); return; } for(int i=0;i<n;++i) { if(!vis[i])//这个条件控制重复的数字 { vis[i]=1; x[v]=y[i]; if(v==0||x[v]<x[v-1])//这个条件控制单调 { dfs(v+1);//递归下去 } vis[i]=0; } } } int main() { while(~scanf("%d%d",&n,&r)) { memset(vis,0,sizeof(vis)); for(int i=0;i<n;++i) { y[i]=n-i; } dfs(0);//调用打印 } return 0; }
还有一些比较优化的方式,不过自己掌握的还不够,暂时不介绍了..
相关文章推荐
- Kafka集群配置
- 迭代器源码
- Python-Selenium2做Web自动化测试(4)-对象的定位
- POJ 2342 Anniversary party(树形DP)
- 网关和路由的区别
- Chrome开发工具Network没有显示完整的http request和response对话
- 02_01 JSP内置对象之概述
- XStream转换java对象与XML
- JavaScript解析Json实现动态修改多级下拉选择列表控件Select
- 【hdoj 1102】A + B Problem II
- AndroidStudio更换黑色主题方法
- 离去
- selenium:你必须知道的七件事
- Linux 下crontab管理RMAN一周自动增量备份
- Android Handler的使用(3)
- 阿米巴与蜂群
- A CANBus Tiny Network without Transceiver ICs : STM32F4 Discovery
- linux共享内存设置
- Lua笔记9-再论函数
- Codeforces Round #261 (Div. 2)