隔板法解排列组合问题题:C(0,m)*C(1,m)……C(m,m)的值

将N个球 分配到M个不同的箱子里,所有的组合排列中,没有任一箱子中的球数&x(x&N)的排列组合数有多少?_百度知道
将N个球 分配到M个不同的箱子里,所有的组合排列中,没有任一箱子中的球数&x(x&N)的排列组合数有多少?
将N个球 分配到M个不同的箱子里(N&M,箱子可为空),在所有可能的组合排列中:任一箱子中的球数&x(x&N)的组合排列数有多少?或者说:每个箱子球数都&=x的组合排列数有多少?求表达式。
问题中的两问,是互补的,是为了给回答者提供两个思路,任答其一问,则另一问自然就解决了。注意,第一问更准确的描述是:至少有一箱子中的球数&x的组合排列数有多少?二楼的回答很认真,但是对第一问误读(可能是我表述不清),不是“每个箱子都大于x个球”,是“至少一个箱子大于x个球”,并且按照你最终给出的算法计算时,出现了小数,这不合理。大家可以参照这个结果:20(=N)个球放入4 (=M)个不同的箱子,箱子可空,容量(x)为9,则有633种放法。
提问者采纳
楼主的这个问题牵涉到不定方程的解的问题,m元不定方程如下:x1+x2+…+xm=n,这个方程的正整数解,或者非负整数解就是你所描述的球与箱子的问题。你把每个未知数xi看成一个箱子里面的球的数目,m个未知数就是m个箱子,而这些未知数的和等于n,就是说总共有n个球。下面再继续讨论这个方程的解的组合数。首先我们解方程的正整数解(非0根)。用隔板法,把n看成n个1,那n个1中间有n-1个空隙,在这n-1个空隙中插入m-1个加号,正好就是我上面描述的m元不定方程x1+x2+…+xm=n,容易知道正整数解的组合是C(m-1,n-1),其中m-1是上标,n-1是下标。接着就是方程的非负整数解(含0根)。令yi=xi+1,则xi=yi-1,于是上述方程变为y1+y2+…+ym=m+n再用一次隔板法得到思想,有关于yi的正整数解的组合数是C(m-1,m+n-1),由xi=yi-1知关于xi的非负整数解的组合数是C(m-1,m+n-1)。我想这样子已经比较全面的回答了楼主的问题了。对于你说的第一问,每个箱子都大于x个球,你可以看成先在每个箱子里面放上x个球,此时还能自由分配的球是n-mx个,再考虑不定方程y1+y2+…ym=n-mx的正整数解的组合数是C(m-1,n-mx-1),即每个箱子都大于x个球的组合数。第二问要复杂一点,但是并非不能解决,我们这样来看,“每个箱子的球数都不大于的x”相对应的是“至少有一个箱子的球数大于x”,而后者的实现是容易的,我们在m个箱子中选一个放入x+1个球的组合数C(1,m),此时还能自由分配的球是n-x-1个,再考虑不定方程y1+y2+…+ym=n-x-1的非负整数解组合数C(m-1,m+n-x-2);以及不定方程z1+z2+…+zm=n的非负整数根的组合数C(m-1,m+n-1),则C(m-1,m+n-1)-C(1,m)*C(m-1,m+n-x-2)就是结果。这些都是手打的,并非粘贴复杂哦,辛苦ing!!&续,我这些都是组合的加减乘,不是概率,你怎么能算出小数??我就不码字了,直接给你“m个箱子中放n个球,每个箱子至多x个球”的结果,如图(在最下)附加的解释下p,就是使得m-1≤m+n-px-p-1成立的最大的正整数p。如你给定的题,m=4,n=20,x=9可以算出p=2代入公式有C(3,23)-[C(1,4)*C(3,13)-C(2,4)*C(3,3)]=633
提问者评价
谢谢,分析的很透彻。
其他类似问题
按默认排序
其他1条回答
(盈+亏)÷两次分配量之差=参加分配的份数 (大盈-小盈)÷两次分配量排列与排列数(1) 定义:从n个不同的元素中任取m 个,按照一定的顺序排
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁C语言如何打印一个数组排列组合? - 推酷
C语言如何打印一个数组排列组合?
问题来自《Linux C一站式编程》,是个挺有意思的题目。
2、定义一个数组,编程打印它的全排列。比如定义:
#define N 3
int a[N] = { 1, 2, 3 };
则运行结果是:
程序的主要思路是:
把第1个数换到最前面来(本来就在最前面),准备打印1xx,再对后两个数2和3做全排列。
把第2个数换到最前面来,准备打印2xx,再对后两个数1和3做全排列。
把第3个数换到最前面来,准备打印3xx,再对后两个数1和2做全排列。
可见这是一个递归的过程,把对整个序列做全排列的问题归结为对它的子序列做全排列的问题,注意我没有描述Base Case怎么处理,你需要自己想。
你的程序要具有通用性,如果改变了N和数组a的定义(比如改成4个数的数组),其它代码不需要修改就可以做4个数的全排列(共24种排列)。
完成了上述要求之后再考虑第二个问题:如果再定义一个常量M表示从N个数中取几个数做排列(N==M时表示全排列),原来的程序应该怎么改?
最后再考虑第三个问题:如果要求从N个数中取M个数做组合而不是做排列,就不能用原来的递归过程了,想想组合的递归过程应该怎么描述,编程实现它。
不考虑数组元素相同的情况,我们可以按照题目提供的思路写出如下代码:
#include &stdio.h&
#define N 3
void perm(int); /*求数组的全排列 */
void print();
void swap(int, int);
int main(){
for(i = 0; i & N; ++i){
a[i] = i + 1;
void perm(int offset){
if(offset == N-1){
// BaseCase
for(i =i & N; ++i){
swap(i, offset);//交换前缀
perm(offset + 1);//递归
swap(i, offset);//将前缀换回来,继续做前一次排列
void print(){
for(i = 0; i & N; ++i)
printf(& %d &,a[i]);
printf(&\n&);
void swap(int i, int offset){
temp = a[offset];
a[offset] = a[i];
如果平常递归写的不多的话,这段代码还是很容易写错的(没错,我就是在说我自己)。
在perm函数递归调用自己之后记得把元素位置交换回去,保证回溯时条件一致。
然后看第二个问题,这是更加一般的排列。仔细观察上面的代码,把特殊推导到一般,主要修改如下(用注释符标出):
#include &stdio.h&
#define N 4
#define M 2
// 取出M个元素进行排列,默认M&=N
void print(){
for(i = 0; i & M; ++i)
// N-&M,打印a里前M个排列元素
printf(& %d &,a[i]);
printf(&\n&);
void perm(int offset){
if(offset == M){
// N-&M,排列到M个数时递归到达BaseCase
for(i =i & N; ++i){
swap(i, offset);
perm(offset + 1);
swap(i, offset);
再来看组合,同样用要求用递归解决,如果相关概念没有搞得很清楚,加上上面写的排列的代码,很容易写不出来(没错,说的还是我),然而代码其实很简单,不过递归确实更加复杂。
void comb(int n, int m)
if (m == 0) {
for (int i = n-1; i &= 0; --i)
b[m-1] = a[i];
comb(i, m-1);
复杂之处在于,排列都是(n-&n-1)这样的递归,然而组合这里是(n-&i,m-&m-1)这样非规律的递归调用,因为i是个变量。
但是组合的算法描述很简单,假设有一个两两元素互不相同的N长数组a,从数组尾端依次取M个数(b1,b2,&&&,bm)成为一个组合,并且满足条件:如果i&j,那么bi在a中的下标一定小于bj。
简单来说,就是从后往前取数组里的M个数,只有保持这样的偏序关系才能保证不会重复组合。
已发表评论数()
&&登&&&陆&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见由从个元素中选取个元素组合,记作:规律可得.
从某学习小组人中选取人参加活动,不同的选法有种.答:不同的选法共有种.
解答此类题目一定要认真观察和分析数据,从中找出规律.
3626@@3@@@@有理数的混合运算@@@@@@239@@Math@@Junior@@$239@@2@@@@有理数@@@@@@49@@Math@@Junior@@$49@@1@@@@数与式@@@@@@7@@Math@@Junior@@$7@@0@@@@初中数学@@@@@@-1@@Math@@Junior@@
第一大题,第11小题
第二大题,第9小题
第一大题,第1小题
第二大题,第9小题
第一大题,第14小题
第二大题,第6小题
第二大题,第10小题
第一大题,第17小题
第二大题,第9小题
第一大题,第6小题
第二大题,第8小题
第一大题,第7小题
第二大题,第9小题
第一大题,第19小题
第二大题,第9小题
第一大题,第6小题
第一大题,第6小题
第二大题,第9小题
第一大题,第6小题
第二大题,第9小题
第一大题,第6小题
第一大题,第5小题
第一大题,第6小题
第二大题,第9小题
第一大题,第8小题
第一大题,第20小题
求解答 学习搜索引擎 | 先阅读下列材料,然后解答问题:从A,B,C三张卡片中选两张,有三种不同选法,抽象成数学问题就是从3个元素中选取2个元素组合,记作{{{C}^{2}}_{3}}=\frac{3×2}{2×1}=3.一般地,从m个元素中选取n个元素组合,记作:{{{C}^{n}}_{m}}=\frac{m(m-1)...(m-n+1)}{n(n-1)...×3×2×1}例:从7个元素中选5个元素,共有{{{C}^{5}}_{7}}=\frac{7×6×5×4×3}{5×4×3×2×1}=21种不同的选法.问题:从某学习小组10人中选取3人参加活动,不同的选法共有___种.利用组合公式来计算;都要利用排列公式来计算.
(种);(种).
本题为信息题,根据题中所给的排列组合公式求解.
3626@@3@@@@有理数的混合运算@@@@@@239@@Math@@Junior@@$239@@2@@@@有理数@@@@@@49@@Math@@Junior@@$49@@1@@@@数与式@@@@@@7@@Math@@Junior@@$7@@0@@@@初中数学@@@@@@-1@@Math@@Junior@@
第二大题,第1小题
第二大题,第1小题
第二大题,第3小题
第一大题,第1小题
第二大题,第1小题
第二大题,第1小题
第二大题,第1小题
第三大题,第2小题
第二大题,第1小题
第二大题,第1小题
第二大题,第1小题
第二大题,第1小题
第二大题,第1小题
求解答 学习搜索引擎 | 先阅读下列材料,然后解答问题:材料1:从三张不同的卡片中选出两张排成一列,有6种不同的排法,抽象成数学问题就是从3个不同的元素中选取2个元素的排列,排列数记为{{{A}_{3}}^{2}}=3×2=6.一般地,从n个不同的元素中选取m个元素的排列数记作{{{A}_{n}}^{m}}.{{{A}_{n}}^{m}}=n(n-1)(n-2)(n-3)...(n-m+1)(m小于等于n)例:从5个不同的元素中选取3个元素排成一列的排列数为:{{{A}_{5}}^{3}}=5×4×3=60.材料2:从三张不同的卡片中选取两张,有3种不同的选法,抽象成数学问题就是从3个元素中选取2个元素的组合,组合数为C\simplebinom_{3}^{2}=\frac{3×2}{2×1}=3.一般地,从n个不同的元素中取出m个元素的排列数记作{{{A}_{n}}^{m}},{{{A}_{n}}^{m}}=n(n-1)(n-2)(n-3)...(n-m+1)(m小于等于n)例:从6个不同的元素选3个元素的组合数为:C\simplebinom_{6}^{3}=\frac{6×5×4}{3×2×1}=20.问:(1)从某个学习小组8人中选取3人参加活动,有 ___种不同的选法;(2)从7个人中选取4人,排成一列,有 ___种不同的排法.排列组合A(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)! 求P=C(3,1)\C(5,3),带乘号的计算过程_百度知道
排列组合A(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)! 求P=C(3,1)\C(5,3),带乘号的计算过程
提问者采纳
C(5,3)为什么要除以3×2×1呀?
这是组合计算,而A(n,m)是排列,排列组合既有联系,又有区别因为m=3时、,所以要要除以3×2×1
提问者评价
原来是这样,感谢!
其他类似问题
C(3,1)=3/1C(5,3)=5*4*3/(3*2*1)P=C(3,1)\C(5,3)
=3*2*1/(5*4*3/3*2*1)
按默认排序
其他1条回答
A(n,m)=C(n,m)*m!C(3,1)=A(3,1)/1!=3C(5,3)=A(5,3)/3!=5*4*3/3!=10P=C(3,1)\C(5,3)=3/10
排列组合的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 排列组合问题 的文章

 

随机推荐