题解 | #放苹果#
放苹果
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]);
}
}
就纠正一句话,两种情况的第一种不该说是有一个盘子空着,而该说至少有一个盘子空着。
有一个盘子空着和没有盘子空着明显没包含有两个盘子空着的情况,会让人引起误解。

