问题描述
每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,
每天下午收工后,常常一双冰鞋都不剩。
每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。
现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。
(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
输入格式
两个整数,表示m和n
输出格式
一个整数,表示队伍的排法的方案数。
样例输入
3 2
样例输出
5
数据规模和约定
m,n∈[0,18]
分析:枚举出所有排法情况再进行分析满不满足题目条件
代码:
#include<iostream> using namespace std; int m, n; int ans = 0; int a[40]; int b[40]; void solve(int cur) { if(cur == m+n) { int flag = 0; for(int i = 0; i < m+n; i++) { if(b[i]) flag++; else flag--; if(flag < 0) break; } if(flag >= 0) ans++; } else for(int i = 0; i < m+n; i++) { if(!i || a[i] != a[i-1]) { int c1 = 0, c2 = 0; for(int j = 0; j < cur; j++) if(a[i] == b[j]) c1++; for(int j = 0; j < m+n; j++) if(a[i] == a[j]) c2++; if(c1 < c2) { b[cur] = a[i]; solve(cur+1); } } } } int main() { cin >> m >> n; for(int i = 0; i < m; i++) a[i] = 1; for(int i = m; i < n; i++) a[i] = 0; solve(0); cout << ans << endl;
return 0; }