问题描述
每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
输入格式
两个整数,表示m和n
输出格式
一个整数,表示队伍的排法的方案数。
样例输入
3 2
样例输出
5
数据规模和约定
m,n∈[0,18]
问题分析: 首先我们要明确这个是排队问题,类比于爬楼梯问题
//未名湖的烦恼 #include<iostream> using 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<<f(3,2)<<endl; }
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
输出
不同的走法数,每一行输入对应一行输出
样例输入
5
8
10
样例输出
8
34
89
//爬楼梯 #include<stdio.h> int 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 ",it(n)); } return 0; }
总结:两个问题都是排队问题,因变量不同,爬楼梯为一个,未名湖为两个,