第四届编程竞赛苹果
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;
}