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