1.问题描述
每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
输入格式
两个整数,表示m和n
输出格式
一个整数,表示队伍的排法的方案数。
样例输入
3 2
样例输出
5
数据规模和约定
m,n∈[0,18]
2.问题描述
任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。
将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=27+23+2^0
现在约定幂次用括号来表示,即a^b表示为a(b)
此时,137可表示为:2(7)+2(3)+2(0)
进一步:7=22+2+20 (2^1用2表示)
3=2+2^0
所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:1315=210+28+2^5+2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
正整数(1<=n<=20000)
输出格式
符合约定的n的0,2表示(在表示中不能有空格)
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
样例输入
1315
样例输出
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
提示:采用非递归程序较难解决,可以采用边递归变输出
3…组合数
从4个人中选2个人参加活动,一共有6种选法。
从n个人中选m个人参加活动,一共有多少种选法?下面的函数实现了这个功能。
请仔细分析代码,填写缺少的部分(下划线部分)。
int f(int n, int m)
{
if(m>n) return 0;
if(m==0) _______________;
return f(n-1,m-1) + _____________;
}
题目分析:
1.当要选的人数多于总人数的时候,有0种情况
2.当要选的人数为0的时候,只有一种情况,全部给你
3.而递归的真正意义在于把4个人选2个人根据选不选这个人分割成:
a.当我选这个人,剩下的情况就是n-1个人中选m-1个人。
b.当我不选这个人的时候,剩下的就是n-1个人中选m个人。
(这个递归就是将一个算式分割成两个残缺的算式,从而利用他们的差别获取答案)
4.计算年龄
有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人多少岁,他说比第3个人大2岁。问第3个人多少岁,他说比第2个人大2岁。问第2个人多少岁,他说比第1个人大2岁。问第1个人多少岁,他说是10岁。请问第5个人多大?
5.一小球从100米高度自由落下,每次落地后反跳回
原高度的一半,再落下,求它在第10次落地时,共经过多少米?
第10次反弹多高?
6.猴子吃桃问题:猴子第一天摘下若
干个桃子,当即吃了一半,还不够过瘾,又多吃了一个;第二天早
上又将剩下的桃子吃了一半,又多吃一个。以后每天都吃了前一天剩
下的一半多一个。到第10天想再吃是,见只有一个桃子了。求第一天共
摘了多少个桃子?