标题:计算N个A与M个B可以组成多少种排列
只看楼主
njzhangyuhao
Rank: 2
等 级:论坛游民
帖 子:197
专家分:35
注 册:2010-11-20
结帖率:100%
 问题点数:0 回复次数:21 
计算N个A与M个B可以组成多少种排列
计算3个A,2个B可以组成多少种排列的问题(如:AAABB, AABBA)是《组合数学》的研究领域。但有些情况下,也可以利用计算机计算速度快的特点通过巧妙的推理来解决问题。下列的程序计算了m个A,n个B可以组合成多少个不同排列的问题。请完善它。
int f(int m, int n)
{
    if(m==0 || n==0) return 1;
    return _______________________;
}
搜索更多相关主题的帖子: 解决问题 计算机 return 
2011-04-29 19:25
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
得分:0 
我看过这个题 这是个递归  
它是国信蓝点杯测试题的第4个

我认为他的意思就是把n各B看成一个整体 所以我写的是

int f(int m, int n)
{
    if(m==0 || n==0) return 1;
    return ________f(m-1,n)+1_______________;
}
因为3元素有4各空  2各元素有三个空  所以f(m,n) = f(m-1,n)+1

                                         
===========深入<----------------->浅出============
2011-04-29 19:40
njzhangyuhao
Rank: 2
等 级:论坛游民
帖 子:197
专家分:35
注 册:2010-11-20
得分:0 
不会这么简单吧 ,他只是举个例子 没写完整 AB混合排列的情况应该要算的吧
2011-04-29 19:43
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
得分:0 
我想过这个问题  但是如果混合算 哪个递归边界条件

就有问题了 因为把0各B放进n各A却是只有一种方法

但是把1各B放入N各A 那么是n+1种方法 这个递归表达式不好推压

我为了这个题已经花了3各小时了  感觉有点想多了  呵呵

                                         
===========深入<----------------->浅出============
2011-04-29 19:49
虾B写
Rank: 8Rank: 8
来 自:湖北
等 级:蝙蝠侠
威 望:3
帖 子:395
专家分:922
注 册:2009-10-1
得分:0 
回复 4楼 laoyang103


[ 本帖最后由 虾B写 于 2011-4-29 20:27 编辑 ]

白娘故意下雨骗许仙的伞。祝英台十八里相送时装疯卖傻调戏梁山伯。七仙女挡住了董永的去路。牛郎趁织女洗澡时拿走了她的衣服。。。这些故事告诉我们;伟大爱情的开始,总归的有一个要先耍流氓!
2011-04-29 20:05
虾B写
Rank: 8Rank: 8
来 自:湖北
等 级:蝙蝠侠
威 望:3
帖 子:395
专家分:922
注 册:2009-10-1
得分:0 
回复 4楼 laoyang103
我错了,没看清,你想的是插入,我想的是替换

白娘故意下雨骗许仙的伞。祝英台十八里相送时装疯卖傻调戏梁山伯。七仙女挡住了董永的去路。牛郎趁织女洗澡时拿走了她的衣服。。。这些故事告诉我们;伟大爱情的开始,总归的有一个要先耍流氓!
2011-04-29 20:10
唯我独魔
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:176
专家分:782
注 册:2011-4-13
得分:0 
只用了一个超级笨的方法去做,莫见怪
#include<stdio.h>
int f(int m, int n);
int k(int m,int n);
int g(int m);
int main(void)
{
    int m=1,n;
    while(m!=0||n!=0)//0,0结束
    {
    scanf("%d%d",&m,&n);
    printf("%d\n",f(m,n));
    }
    return 0;
}
int f(int m, int n)
{
    if(m==0 || n==0) return 1;
    return m>=n?k(n,m):k(m,n);
}
int k(int n,int m)//我直接用数学方法计算出来的,哈哈

 int i,sum;
    for(i=0,sum=0;i<n;i++)
        sum+=g(n-1)*g(m+1)/(g(i)*g(n-1-i)*g(i+1)*g(m-i));
    return sum;
}
int g(int m)//阶乘的算法

 int sum;
    if(m==0)
        return 1;
    for(sum=1;m>=1;m--)
        sum*=m;
    return sum;
}
2011-04-29 22:01
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
得分:0 
如果不把B看成整体,就只是单纯的五个字母列问题了。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-04-29 22:37
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
既然说了是组合数学里的问题,为什么不用一下组合数学里的知识。
不尽相异元素的全排列 有公式。像这种两个的是:(n+m)!/n!m!
解释很容易,n+m 个元素全排列本来应该是 (n+m)! 个,但现在这那算肯定有重复的。
重复产生的原因是,相同的元素互换不能产生新的排列。所以应当除以组内元素的全排列,使组内元素的排列数归一。

如果有n个种类,第i种的个数是 ki,且 k1+k2+...kn = N
那么全排列公式是(大家猜可能也猜到了):N!/k1!k2!...kn!

[ 本帖最后由 pangding 于 2011-4-30 10:58 编辑 ]
2011-04-30 10:52
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
得分:0 
它现在这道题要用递归做,没办法,由于会上面的公式,我做的话肯定会是这个样子:
(n+m)!/n!m! = (n+m-1)!/n!(m-1)! * (n+m)/m

所以答案应该是:
f(m, n) = f(m-1, n) * (n+m)/m

不过这道题纯用高中所学无几的计数知识做,确实比较困难。
2011-04-30 10:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-338395-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.694247 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved