问题描述 每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。 每天早上,租鞋窗口都会排起长龙,假设有还鞋的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; }