问题描述
每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
输入格式
两个整数,表示m和n输出格式
一个整数,表示队伍的排法的方案数。样例输入
3 2样例输出
5数据规模和约定
m,n∈[0,18]问题分析: 首先我们要明确这个是排队问题,类比于爬楼梯问题
//未名湖的烦恼#includeusing namespace std;int f(int m,int n){ if(n>m||(m<1&&n<1)) return 0; if(n==0) return 1; return f(m-1,n)+f(m,n-1);}int main(){ int m,n; //必须满足m>=n cout< <
FangAn(3,2)=FangAn(2,2)+FangAn(3,1)
=FangAn(1,2)+FangAn(2,1) + FangAn(2,1)+FangAn(3,0) =0 + FangAn(1,1)+FangAn(2,0) + FangAn(1,1)+FangAn(2,0) + 1 =0 + FangAn(0,1)+FangAn(1,0) + 1 + FangAn(0,1)+FangAn(1,0) + 1 + 1 =0+0+1+1+0+1+1+1 =5爬楼梯:
描述
树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级也可以第一次走两级,第二次走一级,一共3种方法。输入
输入包含若干行,每行包含一个正整数N,代表楼梯级数,1 <= N <= 30输出不同的走法数,每一行输入对应一行输出样例输入5810样例输出83489//爬楼梯#includeint it(int n){ if(n==1)return 1; else if(n==2) return 2; else return it(n-2)+it(n-1);}int main(){ int n; while(scanf("%d",&n)!=EOF) { printf("%d\n",it(n));} return 0;}
总结:两个问题都是排队问题,因变量不同,爬楼梯为一个,未名湖为两个,