首页 > 编程知识 正文

java开发遇到的难题怎么解决的(java算法难题)

时间:2023-05-06 13:11:12 阅读:73696 作者:1320

第四届编程竞赛苹果

time limit :1000 msmemorylimit :65536 k

总提交:90 accepted :48

描述

把m个相同的苹果放在n个相同的盘子里,允许还有空的盘子,一共有几种不同的分法? (用k表示) 5、1、1和1、5、1是相同的划分方法。

输入输出

第一行是测试数据的数量t(0=t=20 )。 以下每一行包含两个用空格分隔的整数m和n。 1=M,N=10。

输出

对于输入的每组数据m和n,在一行中输出相应的k。

样本输入

1

7 3

样本输出

8

分析结果: http://u zone.univs.cn/blog _ 2984978 _ mgf 8x 9e o w0 qn B2 wre ow1. html

分析:摆放方式应分为盘满和盘不满两种。

(1)因为苹果数量少于盘子数量时,少一个盘子不会影响结果。 (为什么? 如果在10个苹果里放1000个盘子,很多盘子会没用吗? 嘿嘿)这样的时候

fun(m,n )=fun(m ) m,n-1 );

)2)苹果数量少于盘子数量,即使在这种情况下,也可以分为盛放和不盛放。

未满: fun(m,n )转换为fun(m,n-1 ) ) (因为有盘子所以浪费) ) )。

装满:装满后每个盘子都有苹果。 那么,每盘摘一个苹果也是一样的。 此时的fun(m,n )转换为fun(m,m )。 既然每个盘子都必须有苹果,可以认为有没有这些苹果不会影响结果。 例如,为了拿五个苹果放在两个盘子里,又满足每个盘子必须有苹果,两个苹果必须不动,放在盘子下面,他们和盘子融为一体,我们认为看不见他们。 嘿嘿;

那么,函数进来后,盘子和苹果数量的关系每次都满足以上两种情况,每次又归化后继续更简单,就明显地想到了递归。

代码如下。

#包含

intfun(intm,int n ) )。

{

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

返回1; //m可能等于n,但这时,要满足每个盘子里都有,只有一种放置方法。 只有一个盘子也只有一个

if(n==0) ) )。

返回0;

if(nm )//至少有一个盘子空着

返回函数(m,n-1 );

else//至少有一个盘子是空的,不是所有的盘子都是空的

返回fun (m,n-1 ) fun (m-n,n );

}

int main () )

{

printf(%d(n )、fun ) ) 7、3 );

}

我的代码:

#包含

intfun(intm,int n ) )。

{

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

返回1; //m可能等于n,但这时,要满足每个盘子里都有,只有一种放置方法。 只有一个盘子也只有一个

if(n==0) ) )。

返回0;

if(nm )//至少有一个盘子空着

返回函数(m,n-1 );

else//至少有一个盘子是空的,不是所有的盘子都是空的

返回fun (m,n-1 ) fun (m-n,n );

}

int main () )

{

int m,t,n;

wile (扫描(' % d ',t )==1) ) ) ) )。

{

wile(t-- )。

{

扫描(' % d % d )、m、n );

printf(%d(n ),fun ) m,n );

}

}

返回0;

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。