未名湖边的烦恼

问题描述

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

 

posted on 2018-03-12 16:51  ZhangのBlog  阅读(160)  评论(0)    收藏  举报