<返回更多

C语言习题:苹果装盘问题!用递归如何求解?

2021-11-17    C语言编程
加入收藏

C语言习题:苹果装盘问题!用递归如何求解?

 

一、问题提出

问题:把m个苹果放入n个盘子中,允许有的盘子为空,共有多少种方法?

注:

5,1,1和1 5 1属同一种方法

m,n均小于10

二、算法分析

设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;

当m==0(没有苹果可放)时,定义为1种放法;

三、程序设计

#include <stdio.h>

#include <stdlib.h>

int Appledivide(m,n);

int main()

{

int m,n;

printf("请输入苹果和盘子个数(均小于10):n");

scanf("%d%d",&m,&n);

if(m<10&&n<10)

{

int result = appledivide(m,n);

printf("将%d苹果,放入%d个盘子,共有%d中方法",m,n,result);

}

else

printf("苹果或盘子个数应小于10");

return 0;

}

int appledivide(m,n)

{ // 如果碟子只有1个,无论苹果有多少个都只有一种放法

if(m==0||n==1)

{

return 1;

}

//如果碟子的个数大于苹果的个数

if(n>m)

{

return appledivide(m,m);

}

else

{

return appledivide(m,n-1) + appledivide(m-n,n);

}

}

四、程序结果显示

示例:9个苹果9个盘子

C语言习题:苹果装盘问题!用递归如何求解?

 

声明:本站部分内容来自互联网,如有版权侵犯或其他问题请与我们联系,我们将立即删除或处理。
▍相关推荐
更多资讯 >>>