题解 | #放苹果#

放苹果

https://www.nowcoder.com/practice/bfd8234bb5e84be0b493656e390bdebf

import java.util.Scanner;

/**
 * @author Yuri
 * @since 2021/12/15 11:06
 */
public class Main {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int m = in.nextInt();
        int n = in.nextInt();
        int[][] dp = new int[m + 1][n + 1];
        for (int i = 0; i <= m; i++) dp[i][1] = 1; // 无论几个苹果只要有一个盘子就是一种方案
        for (int i = 1; i <= n; i++) dp[0][i] = dp[1][i] = 1; // 有一个苹果,一个以上的盘子就是一种方案,没有盘子则不算一种方案

        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (i < j) dp[i][j] = dp[i][i]; // 苹果<盘子 则必有j-i个盘子空着,所以其实就相当于只有i个盘子
                else dp[i][j] = dp[i][j - 1] + dp[i - j][j]; // 苹果>盘子 则分两种情况:
                // ①.至少有一个盘子空着,dp[i][j-1],因为其包含了dp[i][j-2]的结果,所以其实也涵盖了2...n-1个盘子空着的可能
                // ②.没有盘子空着,则至少每个盘子有一个苹果。dp[i-j][j]
            }
        }
        System.out.println(dp[m][n]);
    }
}

就纠正一句话,两种情况的第一种不该说是有一个盘子空着,而该说至少有一个盘子空着。

有一个盘子空着和没有盘子空着明显没包含有两个盘子空着的情况,会让人引起误解。

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务