题解 | #放苹果#
非常典型的一道动态规划的题,做个记录。
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]); } }