未名湖的烦恼
每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
输入格式
两个整数,表示m和n
输出格式
一个整数,表示队伍的排法的方案数。样例输入3 2样例输出5数据规模和约定 m,n∈[0,18]
以下是网上大牛们贴出的代码:import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m = sc.nextInt(); int n = sc.nextInt(); System.out.println(fun(m, n)); } public static int fun(int m, int n) { if (m < n) return 0; if (n == 0) return 1; return fun(m - 1, n) + fun(m, n - 1); } }
我一直都不能很清楚的理解这行代码:
return fun(m - 1, n) + fun(m, n - 1);在网上也没看到大牛们清晰的解释,反倒是看到很多人解释的意思完全不一样???
正好我刚学会一丢丢dfs,嘿嘿,本着现学现卖的原则我就用dfs做了一遍,各种yy,见笑:
import java.util.Scanner; //dfs public class Main { static int[] mk = new int[100]; static int count = 0; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m = sc.nextInt(); int n = sc.nextInt(); dfs(m, n); System.out.println(count); } public static void dfs(int m, int n) { if (m < n || m < 0 || n < 0) // 当借鞋子的人数大于还鞋子的人数时排序方法为0(同时解决边界问题) return; if (n == 0) { // 当借鞋子的人数为0时,只有一种排序方法。 count += 1; return; } // 继续向下搜索,从最后一位开始排序。 dfs(m - 1, n); // 当下一位为还鞋子的人时 dfs(m, n - 1); // 当下一位为借鞋子的人时 } }