多维算法思考(三):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数据结构 ...
随机推荐
- SNMP WINDOWS系统的命令行工具下载
SNMP windows系统的命令行工具snmputil.exe下载链接:请点击
- java 二维码原理以及用java实现的二维码的生成、解码(转)
http://blog.csdn.net/songylwq/article/details/8643948 http://sjsky.iteye.com/blog/1136934 http://bbs ...
- Ubuntu Linux中开启MySQL远程访问功能
为了给服务器一个真实的运行环境,今天在内网中部署了一台Ubuntu Linux服务器,其中最头疼的就是MySQL的安装,apt下载更新的速度太慢了,于是就自行编译了一下MySQL的源码,具体的编译方法 ...
- index_ss hint 使用的运行计划变化对照
index_ss hint 使用的运行计划变化对照 当中 buffer 代表:当前操作中发生的内存读次数,包括一致性读和当前读 尽管 emp 表记录数不多,可是buffer 读内存的次数区别还是有点 ...
- iOS pragma mark要使用
郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠.支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 简单的来说 ...
- combobox自己主动提示组件加入无选中项清空功能
这个标题非常绕口,只是这也是想了半天的成果,对不起体育老师了. 标题想表达的是:之前讲过的用combobox实现自己主动提示组件.只是如今规定该组件不能够保存data中不存在的数据. 最初的想法是通过 ...
- VIM
初步
按i前插入字符.a在光标后追加字符 ctrl+d将光标下称半个窗体.按Ctrl+u将光标上移半个窗体 在输入模式下:ctrl+h删除字符,ctrl+u删除行.ctrl+w删除字 命令模式下.x删除字符 ...
- SQL Server 2008 (R2) 单机版安装的先决条件
原文:SQL Server 2008 (R2) 单机版安装的先决条件 出自:http://blogs.msdn.com/b/apgcdsd/archive/2012/03/07/sql-server- ...
- Centos 7 学习加入用户
正在使用 Centos 许多人前使用Ubuntu,因此, useradd 和 adduser 两个命令歧义,于Ubuntu这是在系统上两个命令,于Centos在这同一个命令,adduser 在一个链接 ...
- 表复制语句select into from 与 insert into select 区别鉴赏
select into from 与 insert into select 区别鉴赏 1.INSERT INTO SELECT语句 语句形式为:Insert into Table2(field1,fi ...