多维算法思考(三):AB组合问题
多维算法思考(三):AB组合问题
题目:x个A,y个B可以组合成多少个不同排列的问题。
首先,我们用数学的方式思考,这个问题属于《组合数学》的问题,我们的第一种方法可以用组合思路来求解。
也就是说在x+y个单元格中随机选出x个单元格用来存放A,那么其他的也就自然存放B,所以共有种不同的排列,例如当x=3,y=2时,可组成10种不同的排列。
这种方法虽好,但不直观。如果我们要列出所有的AB组合,这种方法显然不容易办到,这时我们可以用另一种方法来求解。利用递归的思想。我们用f(x,y)表示x个A,y个B可以组合成的不同排列数,则当第一个是A时,共有f(x-1,y)种不同排列数,当第一个是B时,共有f(x,y-1)种不同排列数。所以f(x,y)=f(x-1,y)+f(x,y-1)。
也许有人会问,这样一个递归式子,我们不是一样看不出来AB组合吗?确实,从表面看,我们也不能直观的列出AB组合。这是我们需要对其变通一下,将它转换成树状图。下面我们还是以x=3,y=2为例:
x每减一,树枝上就会多一A;y每减一,树枝上就会多一B。若x或y为0,则结束,剩下的数字即为B或A的个数。上述AB组合从左到右依次为AAABB--AABAB--AABBA--ABAAB--ABABA--ABBAA--BAAAB--BAABA--BABAA--BBAAA共可组成10种不同的排列。
下面我们用C语言来实现上述递归算法。(递归执行顺序图如下)
算法思路:原理同上述树状执行图。我们先设两个全局变量p,q,初始值p=x,q=y。通过每一次x与p,y与q的大小比较来判断执行的流程。
当x=0或y=0时结束。用数组a[5]来记录执行过程中AB的顺序。
完整算法:
- //x个A,y个B可以组合成多少个不同排列的问题
- #include<stdio.h>
- #define x 4
- #define y 2
- int p=x,q=y,k=;
- char a[];
- int fun(int m,int n)
- {
- if(m<p)
- {
- a[k++]='A';
- p=m;
- q=n;
- if(m==)
- {
- for(int j=;j<k;j++)
- printf("%c",a[j]);
- for(int i=;i<n;i++)
- printf("B");
- printf("\n");
- k--;
- p++;
- return ;
- }
- }
- else if(m>p)
- {
- for(int i=p;i<m;i++)
- k--;
- p=m;
- if(q==n)
- {
- q++;
- k--;
- }
- }
- if(n<q)
- {
- a[k++]='B';
- p=m;
- q=n;
- if(n==)
- {
- for(int j=;j<k;j++)
- printf("%c",a[j]);
- for(int i=;i<m;i++)
- printf("A");
- printf("\n");
- k--;
- q++;
- return ;
- }
- }
- else if(n>q)
- {
- for(int i=q;i<n;i++)
- k--;
- q=n;
- if(p==m)
- {
- p++;
- k--;
- }
- }
- return fun(m-,n)+fun(m,n-);
- }
- void main()
- {
- printf("\n%d个A,%d个B可组成%d种不同的排列\n",x,y,fun(x,y));
- }
执行效果图:
多维算法思考(三):AB组合问题的更多相关文章
- 基于C#程序设计语言的三种组合算法
目录 基于C#程序设计语言的三种组合算法 1. 总体思路 1.1 前言 1.2 算法思路 1.3 算法需要注意的点 2. 三种组合算法 2.1 普通组合算法 2.2 与自身进行组合的组合算法 2.3 ...
- js架构设计模式——你对MVC、MVP、MVVM 三种组合模式分别有什么样的理解?
你对MVC.MVP.MVVM 三种组合模式分别有什么样的理解? MVC(Model-View-Controller)MVP(Model-View-Presenter)MVVM(Model-View-V ...
- 数据挖掘算法(三)--logistic回归
数据挖掘算法学习笔记汇总 数据挖掘算法(一)–K近邻算法 (KNN) 数据挖掘算法(二)–决策树 数据挖掘算法(三)–logistic回归 在介绍logistic回归之前先复习几个基础知识点,有助于后 ...
- 【原创】开源.NET排列组合组件KwCombinatorics使用(三)——笛卡尔积组合
本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...
- java排序算法(三):堆排序
java排序算法(三)堆排序 堆积排序(HeapSort)是指利用堆积树这种结构所设计的排序算法,可以利用数组的特点快速定位指定索引的元素.堆排序是不稳定的排序方法.辅助空间为O(1).最坏时间复杂度 ...
- Java数据结构和算法(三)顺序存储的树结构
Java数据结构和算法(三)顺序存储的树结构 二叉树也可以用数组存储,可以和完全二叉树的节点一一对应. 一.树的遍历 // 二叉树保存在数组中 int[] data; public void preO ...
- LK光流算法的三个假设
在实际过程中采用 Lucas-Kanade 光流算法跟踪运动物体特征点的时候,一个很明显的特点是LK算法(包括其他光流算法)不能计算"大运动",加上金子塔的方法稍微好点. 这是什么 ...
- Java排序算法(三)
Java排序算法(三) 三.Java排序算法总结 从这三组时间复杂度对比中,可以看出,堆排序和归并排序是不管在什么情况下发挥稳定的,快速排序好的时候表现如天才,坏情况下比较差强人意,甚至在等待排序个数 ...
- 重读《学习JavaScript数据结构与算法-第三版》- 第4章 栈
定场诗 金山竹影几千秋,云索高飞水自流: 万里长江飘玉带,一轮银月滚金球. 远自湖北三千里,近到江南十六州: 美景一时观不透,天缘有分画中游. 前言 本章是重读<学习JavaScript数据结构 ...
随机推荐
- 【Java GUI】Java GUI基金会
AWT和Swing Swing是个AWT改进和扩展. 书写GUI规划.Swing和AWT曾效力.他们共存 Java基础类(JFC)于. 虽然AWT和Swing都提供了构造图形界面元素的类.但它们的虫药 ...
- JNI 可变印刷
1.包log.h #ifndef __MULTI_TRACE_H__ #define __MULTI_TRACE_H__ #ifdef ANDROID_NDK_BUILD #define LOG_TA ...
- 写你自己struts1框架
前言 文本 它们的定义Struts1 commons-digester.jar解析XML 实现XML标签到对象的转换 1.依据目标XML的结构定义解析规则文件 參照rule.xml 2.创建集合对象接 ...
- [LeetCode217]Contains Duplicate
题目:Given an array of integers, find if the array contains any duplicates. Your function should retur ...
- ReplaceGoogleCDN:将 Google CDN 更换国家
Chrome Web Store 安装地址: https://chrome.google.com/webstore/detail/replace-google-cdn/kpampjmfiopfpkk ...
- UVa11488-Hyper Prefix Sets(trie树)
H Hyper Prefix Sets Prefix goodness of a set string is length of longest common prefix*number of str ...
- Redis源代码分析(二十八)--- object创建和释放redisObject物
今天的学习更有效率.该Rio分析过,学习之间的另一种方式RedisObject文件,只想说RedisObject有些生成和转换.都是很类似的.列出里面长长的API列表: /* ------------ ...
- php中国的垃圾问题
header这条线加,这是解决中国乱码的问题. 版权声明:本文博主原创文章,博客,未经同意不得转载.
- 第七章——DMVs和DMFs(2)——用DMV和DMF监控索引性能
原文:第七章--DMVs和DMFs(2)--用DMV和DMF监控索引性能 本文继续介绍使用DMO来监控,这次讲述的是监控索引性能.索引是提高查询性能的关键性手段.即使你的表上有合适的索引,你也要时时刻 ...
- CodeForces 441 A. Valera and Antique Items
纯粹练JAVA.... A. Valera and Antique Items time limit per test 1 second memory limit per test 256 megab ...