求组合数算法思想及代码
2016-03-19 16:34
330 查看
求组合数,从n个数中拿出m个数,并列出其组合方式:
思想:
利用递归,一个一个的取出来:
例: void combine(int a[],int n,int m,const int M)
对 1 2 3 4 5 从这5个数中取出3个
从后往前,先取出一个数
1 2 3 4 5
从加粗的数字中取出一个相应的数 1 2 3 4 5
假设取5,把它存在一个数组b[]中 b[]:5
然后继续 1
2 3 4 5
假设取 4 1 2 3
4 5 b[]:5 4
然后再取
假设取3 取完三个输出 b[]:5 4 3
然后进行递归,直到完全输出!
来看代码:
注意for循环,
注意m:m代表for循环的最小值,因为如果小于m其去取的数肯定不够,可以把该函数在n个数中选择m-1个数,直到m==1
思想:
利用递归,一个一个的取出来:
例: void combine(int a[],int n,int m,const int M)
对 1 2 3 4 5 从这5个数中取出3个
从后往前,先取出一个数
1 2 3 4 5
从加粗的数字中取出一个相应的数 1 2 3 4 5
假设取5,把它存在一个数组b[]中 b[]:5
然后继续 1
2 3 4 5
假设取 4 1 2 3
4 5 b[]:5 4
然后再取
假设取3 取完三个输出 b[]:5 4 3
然后进行递归,直到完全输出!
来看代码:
int combine(int a[],int n,int m,int c[],const int M) //从n个数中取出m个数,a[]为其原数 { //c[] 用来储存,方便输出,M为静态变量,其值不变 for(int i=n;i>=m;i--) { c[m]=i; if(m>1) combine(a,i-1,m-1,c,M); else//输出 { for(int j=1;j<=M;j++) printf("%d",b[j]); } } }
注意for循环,
注意m:m代表for循环的最小值,因为如果小于m其去取的数肯定不够,可以把该函数在n个数中选择m-1个数,直到m==1
相关文章推荐
- Android 图解向 Android Studio 中导入 Eclipse 工程的步骤
- 源码下修改开机动画及开机logo
- Java SE7新特性之try-with-resources语句
- C#高级编程(第六版)学习:第三十一章:Windows窗体
- 计算代码运行时间
- 解决java_home does not point a valid jvm的问题
- 算法基础 回文数
- 49.新起一个纯代码空白工程
- Window下python编程
- C++中的函数知识点详解
- Zend Studio的常用配置和使用方法
- python pandas dataframe to_sql方法error及其解决
- C++二叉树的建立、前序、中序、后序遍历
- php正则表达式
- C/C++ 错题总结
- 基于最小优先级队列构造哈夫曼树 Java
- (转)C# 温故而知新:Stream篇(二)
- java学习之在myclipse中利用jdbc连接数据库
- Java中private , public , protected 几个关键字
- c#学习