多维算法思考(三):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组合问题的更多相关文章

  1. 基于C#程序设计语言的三种组合算法

    目录 基于C#程序设计语言的三种组合算法 1. 总体思路 1.1 前言 1.2 算法思路 1.3 算法需要注意的点 2. 三种组合算法 2.1 普通组合算法 2.2 与自身进行组合的组合算法 2.3 ...

  2. js架构设计模式——你对MVC、MVP、MVVM 三种组合模式分别有什么样的理解?

    你对MVC.MVP.MVVM 三种组合模式分别有什么样的理解? MVC(Model-View-Controller)MVP(Model-View-Presenter)MVVM(Model-View-V ...

  3. 数据挖掘算法(三)--logistic回归

    数据挖掘算法学习笔记汇总 数据挖掘算法(一)–K近邻算法 (KNN) 数据挖掘算法(二)–决策树 数据挖掘算法(三)–logistic回归 在介绍logistic回归之前先复习几个基础知识点,有助于后 ...

  4. 【原创】开源.NET排列组合组件KwCombinatorics使用(三)——笛卡尔积组合

           本博客所有文章分类的总目录:本博客博文总目录-实时更新 本博客其他.NET开源项目文章目录:[目录]本博客其他.NET开源项目文章目录 KwCombinatorics组件文章目录: 1. ...

  5. java排序算法(三):堆排序

    java排序算法(三)堆排序 堆积排序(HeapSort)是指利用堆积树这种结构所设计的排序算法,可以利用数组的特点快速定位指定索引的元素.堆排序是不稳定的排序方法.辅助空间为O(1).最坏时间复杂度 ...

  6. Java数据结构和算法(三)顺序存储的树结构

    Java数据结构和算法(三)顺序存储的树结构 二叉树也可以用数组存储,可以和完全二叉树的节点一一对应. 一.树的遍历 // 二叉树保存在数组中 int[] data; public void preO ...

  7. LK光流算法的三个假设

    在实际过程中采用 Lucas-Kanade 光流算法跟踪运动物体特征点的时候,一个很明显的特点是LK算法(包括其他光流算法)不能计算"大运动",加上金子塔的方法稍微好点. 这是什么 ...

  8. Java排序算法(三)

    Java排序算法(三) 三.Java排序算法总结 从这三组时间复杂度对比中,可以看出,堆排序和归并排序是不管在什么情况下发挥稳定的,快速排序好的时候表现如天才,坏情况下比较差强人意,甚至在等待排序个数 ...

  9. 重读《学习JavaScript数据结构与算法-第三版》- 第4章 栈

    定场诗 金山竹影几千秋,云索高飞水自流: 万里长江飘玉带,一轮银月滚金球. 远自湖北三千里,近到江南十六州: 美景一时观不透,天缘有分画中游. 前言 本章是重读<学习JavaScript数据结构 ...

随机推荐

  1. Appium0.18.x迁移到Appium1.x须知事项(灰常实用,解答了本人几个疑问)

    英文原版:https://github.com/appium/appium/blob/master/docs/en/advanced-concepts/migrating-to-1-0.md Migr ...

  2. 【Web探索之旅】第二部分第五课:响应式网站和移动应用

    内容简介 1.第二部分第五课:响应式网站和移动应用 2.第三部分第一课预告:服务器 第二部分第五课:响应式网站和移动应用 在我们开始聊响应式网站之前,我们可以聊聊移动App(App是Applicati ...

  3. Windows Phone 的控件倾斜效果

    原文:Windows Phone 的控件倾斜效果 Windows Phone 7的系统设置里,按钮都有一个点击倾斜的效果,但自己添加的控件就没有.但微软提供了这个效果的代码:TiltEffect MS ...

  4. Handler消息源代码分析

    public static final Looper myLooper() { return (Looper)sThreadLocal.get(); } 首先到Handler运行过程的总结: 1. L ...

  5. Vertica: 基于DBMS架构的列存储数据仓库

    介绍 Vertica(属于HP公司),是一个基于DBMS架构的数据库系统,适合读密集的分析型数据库应用,比方数据仓库,白皮书中全名称为VerticaAnalytic Database.从命名中也可以看 ...

  6. 在SSMS里查看TDS数据包内容

    原文:在SSMS里查看TDS数据包内容 在SSMS里查看TDS数据包内容 摘抄自<SQLSERVER2012实施与管理实战指南> 要具体查看TDS数据库的内容,我们可以: 用NETWORK ...

  7. android应用框架构建------AppManager

    体验一些Android应用程序开发的个人总结 当我们开发应用程序.经常有非常多非常多activity,在这一刻,我们需要一个activity堆栈,以帮助管理activity的finish和start. ...

  8. Java实现 Base64、MD5、MAC、HMAC加密(转)

    开始对那些基本的加密还不怎么熟练,然后总结了些,写了一个测试:支持 Base64.MD5.MAC.HMAC加密,长话短说,我们都比较喜欢自己理解,看代码吧! 采用的输UTF-8的格式... packa ...

  9. Android+NDK+CDT+eclipse+OPenGL ES编制和native调试

    周围环境: NDK版本号r8,eclipse和Android运用adt-bundle-windows-x86打包版本是更方便, 一.NDK汇集 1.源代码 NDK的examples文件夹中有Hello ...

  10. Android 根据规划 Touch 分配和消费机制的事件

    Android 中与 Touch 事件相关的方法包含:dispatchTouchEvent(MotionEvent ev).onInterceptTouchEvent(MotionEvent ev). ...