1. 在说放苹果问题之前,先说下斐波那契数列递归求解时的时间复杂度。
由公式f(n) = f(n - 1) + f(n - 2)很容易画出其递归树:
每个节点都会调用一次f(n),满二叉树节点数m = 2^h - 1,h是树高度。
则O(n) = 2^N.
2.放苹果问题
题目描述
把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
递归解法:
public static int fun(int m, int n) {
if (m < 0) return 0;
if (n == 1 || m == 0) return 1;//只有一个盘子时只有1中放法;没有苹果时也只有一种放法——全空
return fun(m, n - 1) + fun(m - n, n);//至少有1个空盘子;全都是满盘子
}
动态规划解法:
public static int fun2(int m, int n) {
int[][] dp = n