题解 | #放苹果#

非常典型的一道动态规划的题,做个记录。

import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        int n = sc.nextInt();
        if (m == 0 || m == 1 || n == 1) {
            System.out.println(1);
            return;
        }
        helper(m, n);
    }
    
    public static void helper(int m, int n) {
        int[][] dp = new int[m+1][n+1];
        for (int i = 0; i <= m; i++) {
            dp[i][1] = 1;
        }
        for (int i = 0; i <= n; i++) {
            dp[0][i] = 1;
            dp[1][i] = 1;
        }
        
        for (int apple = 2; apple <= m; apple++) {
            for (int plate = 2; plate <= n; plate++) {
                if (apple < plate) {
                    // 苹果少于盘子,必然会有空盘子
                    // 空盘子等价,则等同于apple个苹果放到apple个盘子里
                    dp[apple][plate] = dp[apple][apple];
                } else {
                    // 苹果多余盘子数,依据是否有空盘子有两种情况
                    // 1.多余的apple-plate个苹果放到plate的情景
                    // 2.apple个苹果放到plate-1个盘子的情况(至少一个盘子为空)
                    dp[apple][plate] = dp[apple-plate][plate] + dp[apple][plate-1];
                }
            }
        }
        
        System.out.println(dp[m][n]);
    }
}


全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务