爬楼梯与未名湖的烦恼

问题描述
每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。

每天早上,租鞋窗口都会排起长龙,假设有还鞋的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;
} 
View Code

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\n",it(n));
}

 return 0;
}
View Code

总结:两个问题都是排队问题,因变量不同,爬楼梯为一个,未名湖为两个,

posted @ 2019-02-16 13:44  Hello_World2020  阅读(203)  评论(0编辑  收藏  举报