(1)
事先为了把这个问题说明的清楚一点,我打算用一个比喻,而且另外一个原因是我参考的资料里面也是用的这个比喻来说明这个问题的。
那么可以先看成是将200个苹果要放在25个盘子里。
我们用f(m,n)来表示要把m个苹果放在n个盘子里的种数(不同的是盘子可以为空,不可以为空的时候我们只需要将讨论作一个很小的改动,这个会在后面说到)。现在来看一下一个递归算法:
先对n作讨论,如果n>m,必定有n-m个盘子永远空着,去
掉它们对摆放苹果方法数目不产生影响;即
if(n>m) f(m,n) = f(m,m)
当n<=m时,不同的放法可以分成两类:即有至少一个
盘子空着或者所有盘子都有苹果,前一种情况相当于
f(m,n) = f(m,n-1);
后一种情况可以从每个盘子中拿掉一个苹果,不影响
不同放法的数目,即
f(m,n) = f(m-n,n). 而总的放苹果的放法数目等于两
者的和,即
f(m,n) =f(m,n-1)+f(m-n,n)
这个递归的出口就在于:
当n=1时,所有苹果都必须放在
一个盘子里,所以返回1;当没有苹果可放时,
定义为1种放法;递归的两条路,第一条n会逐
渐减少,终会到达出口n==1; 第二条m会逐渐减
少,因为n>m时,我们会return f(m,m) 所以终
会到达出口m==0.
但是由于所要解决的问题中不能出现空盘子,就必须先在每个盘子上放一个苹果,于是最后的结论就是只需要计算f(175,25)的值。
递归的算法对于很大的数字的时候进行人工计算会有很大的计算量,如果用C语言写成程序的话,源程序为:
/**********************************/
//(由于电脑上没有装编译软件,可能会有BUG)
#include
int f(int m, int n){
if(n==1 || m==0) return 1;
if(n>m) return f(m,m);
return f(m,n-1)+f(m-n,n);
}
void main(){
int re;
re=f(175,25);
printf("%d\n",re);
}
//注:参考资料下载http://ai.pku.edu.cn/cpp2007/lecture/7.pdf
/**********************************/
(2)
这个问题就是一个简单的组合问题,如一楼所述,只要将200个苹果中间的199个空隙中随机插入24个分隔。最后就是要求C(199,24)
/**********************************/
//(由于电脑上没有装编译软件,可能会有BUG)
#include
int c(int m, int n){//组合的算法,为从m中随机选取n个
if(n==0 || n==m) return 1;
return c(m-1,n)+c(m-1,n-1);
}
void main(){
int re;
re=c(199,24);
printf("%d\n",re);
}
/**********************************/
(3)
先在每个盘子中放4个。现在就剩下100个苹果和25个盘子,并且这里的盘子里都是可以随便放苹果,就形成了这样一种模型:100个苹果和25个盘子形成了125个位置,盘子要在其中占据25个位置,便是要求C(125,25)
/**********************************/
//(由于电脑上没有装编译软件,可能会有BUG)
#include
int c(int m, int n){//组合的算法,为从m中随机选取n个
if(n==0 || n==m) return 1;
return c(m-1,n)+c(m-1,n-1);
}
void main(){
int re;
re=c(125,25);
printf("%d\n",re);
}
/**********************************/
问题2:假如不要求加数由低至高排列,例如可将“1+1+1+1+1+1+……+1+176”与“176+1+1+1+1+1+1+……+1”视为两种拆法,那又一共有多少种拆法?
200=1+1+1+1+-----------+1
共有200个1,有199个加号
在199个加号中任取其中24个加号即为所求:
C199(24)=199*198*197*-----*176/24!
别外二题不会
第一题,p(n)定义于正整数上的函数,有个欧拉公式,p(1)=1,p(2)=2,p(3)=3,当n≥3时,有递推公式p(n)=(0
给你个思路,让你能自己解决所有问题:考虑200个球分到50个盒中。将200个球排成一排,200个球中间有199个空,199个空中插入49个板就可将球分成50份。如果要求最小加数大于n+1,可以先在50个盒中各放n个,以后的我就不用多说了吧~