多维算法思考(三):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数据结构 ...
随机推荐
- iOS 中client和server的 Web Service 网络通信 (2)
在实际的应用开发过程中,同步请求的用户体验并非非常好:我们都知道.Apple是非常重视用户体验的.这一点也成为了行业的标杆,没实用户哪里来的好产品.所以用户体验是极其重要的.貌似废话有点多.接下来进入 ...
- Hosting WCF Service
之前在博客几个实例DemoWCF服务寄宿到控制到应用程序中,这篇来总结一下,经常使用的几种宿主的方式. 1.Self-Hosting 一个WCF服务可以寄宿在控制台应用程序或者WinForms app ...
- 对ESB概念的理解(转)
http://www.ibm.com/developerworks/cn/webservices/0811_magy_esb/ 什么是 ESB?ESB 严格来说不是某一个产品,而是一种框架,设计模式. ...
- System.Threading.ThreadStateException
异常:"System.Threading.ThreadStateException"在未处理的异常类型 System.Windows.Forms.dll 发生 其它信息: 在能够调 ...
- telnet发电子邮件
无聊今天的工作,想想一个学生被提到最后一次telnet发电子邮件,所以我想试试.最后,成功的实践,这里做个总结. 首先,cmd进telnet打开回话: 下面红色字体为命令. 1.open smtp.1 ...
- Oracle中merge into的使用 (转)
该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据. ORACLE 9i 中,使用此命令必须同时指定UPDATE 和INSERT 关键词,ORACLE 10g 做了如下改动. 1.ins ...
- unix pwd使用命令
[语法]: pwd [说明]: 此命令会显示当前的工作文件夹 []: pwd 这显示当前工作文件夹 版权声明:本文博主原创文章.博客,未经同意不得转载.
- Java 启动线程的方式
面试题:JAVA启动线程的方式有哪些? 1.继承Thread [java] view plaincopy public class java_thread extends Thread{ public ...
- 在win7在结构cocos2d-x v3.2rc0开发环境(For Android)
cocos2d-x 这是现在比较流行的游戏引擎., 因此.本文的目的在于教导新手怎样在win7下建立cocos2dx开发环境, 截止本文,cocos2dx的最新版本号为 v3.2rc0版,我将如果您的 ...
- NSIS:强制结束软件进程
原文NSIS:强制结束软件进程 有时候,我们选择卸载软件后发现安装目录中的主文件依然存在,不是我们卸载代码写的不对,而是卸载的时候软件根本就没有关闭! 在卸载前加上下面这个宏可以在一定程度上免除上述的 ...