[算法]放苹果问题

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 = new int[m + 1][n + 1];
        for (int i = 1; i <= m; i++) {
            dp[i][1] = 1;
        }
        for (int i = 1; i <= n; i++) {
            dp[1][i] = 1;
            dp[0][i] = 1;
        }
        
        for (int i = 2; i <= m; i++) {
            for (int j = 2; j <= n; j++) {
                if (i >= j) {
                    dp[i][j] = dp[i][j - 1] + dp[i - j][j];
                } else {
                    dp[i][j] = dp[i][j - 1];
                }
            }
        }
        return dp[m][n];
    }



猜你喜欢

转载自blog.csdn.net/u010292561/article/details/80578316