未名湖边的烦恼(递归)

    xiaoxiao2021-03-26  30

    问题描述       每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。    每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)    输入格式

    两个整数,表示m和n

    输出格式

    一个整数,表示队伍的排法的方案数。

    样例输入

    3 2

    样例输出

    5

    数据规模和约定   m,n∈[0,18]

    链接:http://lx.lanqiao.cn/problem.page?gpid=T303

    思路:一开始看到这个题就感觉是递归,于是赶紧写了一个一个一个放的,一提交,发现只有88分,奇了怪了,然后在网上搜了一下。发现网上的思路是从后往前倒退,第一个位置只能是还鞋子的人,就不好从0开始实现,所以以后如果发现正着不行,就要换一种思路,反着来,学到一句话,正着不行,咱就试试反着推,递推不行,就想想递归。

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; int dp(int a, int b) { if(a < b) return 0; if(b == 0) return 1; return dp(a-1,b)+dp(a,b-1); } int main() { int m,n,sum; while(cin >> m >> n) { sum = dp(m,n); cout << sum << endl; } return 0; } //丑丑的88分代码 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> using namespace std; int m,n, sum; void dp(int a, int b) { if(a > m || b > n) return ; if(a == m && b == n) { sum++; return ; } if( a < b) return ; a++; dp(a,b); a--; b++; dp(a,b); b--; } int main() { while(cin >> m >> n) { sum=0; dp(0,0); cout << sum << endl; } return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-660210.html

    最新回复(0)