问题描述
每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
输入格式
两个整数,表示m和n
输出格式
一个整数,表示队伍的排法的方案数。
样例输入
3 2
样例输出
5
数据规模和约定
m,n∈[0,18]
问题分析
问题分析
import java.util.*; public class Main { private int m; private int n; private Scanner scanner; //第一种解题方案 public Main(){ scanner = new Scanner(System.in); m = scanner.nextInt(); n = scanner.nextInt(); if(m<n) System.out.println(0); else System.out.println(solve(m,n)); } /** private int solve(int i,int j){ if (i<j){//如果剩余的m比n多一定不行 return 0; } if(i==0){//如果n已经是0了当然可以 return 1; } return solve(i-1,j) + solve(i,j-1); } */ /** * 从第一个开始放 * @i 代表还的人还剩i个 * @j 代表借鞋的人还有j个 */ private int solve(int i,int j){ if(i==0||j==0){ return 1; } //如果前面放鞋子的人和借鞋子的人相等,那么此时只能还鞋子 if(m-i==n-j){ return solve(i-1,j); } //剩下的情况只有已经还鞋子的人比借鞋子的人多,则还鞋子和借鞋子的人都可以排在这个位置 if(m-i>n-j) return solve(i-1,j) + solve(i,j-1); return 0; } public static void main(String[] args) { new Main(); } }