Bootstrap

蓝桥杯:冰鞋借还排队问题(未名湖边的烦恼) 递归解法

蓝桥杯:冰鞋借还排队问题(未名湖边的烦恼) 递归解法

问题描述

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

3 2

样例输出

5

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

思路

其实总共就是 【借】 和 【还】 两种状态,那么用二进制串(或者int数组)可以表示排队的状态,那么问题就变得很简单了

  • 用 0 表示还冰鞋,用 1 表示借冰鞋
  • 根据借还的人数 m,n 穷举所有长度为 m+n 的,0 的数量为m,1 的数量为n的 0-1 串(二进制串)
  • 变量 num 表示持有的冰鞋数量,从串头开始遍历,如果遇到 0,num++,如果遇到 1,num–
  • 如果遍历全程,每次操作后,数量num不为负数,则该序列为合法排队序列

完整代码

#include <iostream>

using namespace std;

int m, n;		// 还,借的人数 
int return_num;	// 当前剩下多少人没还 
int borrow_num;	// 当前剩下
;