递归版本
#include <stdio.h>
// 递归函数计算分苹果的方法数
int partition(int m, int n) {
if (m == 0 || n == 1) {
return 1; // 若苹果数为0或盘子数为1,只有一种分法
}
if (m < n) {
return partition(m,m);
// 若苹果数小于盘子数,等同于每个盘子都盛放一个苹果
} else {
return partition(m, n - 1) + partition(m - n, n);
// 分为有一个盘子空着和每个盘子都有苹果两种情况
}
}
int main() {
int m, n;
// 读取每行输入数据,计算分法并输出结果
while (scanf("%d %d", &m, &n) != EOF) {
int result = partition(m, n);
printf("%d\n", result);
}
return 0;
}
动态规划版本
#include <stdio.h>
// 动态规划函数计算分苹果的方法数
int partition_dp(int m, int n) {
int dp[11][11] = {0}; // 定义动态规划数组,dp[i][j]表示将i个苹果放入j个盘子的方法数
// 初始化边界条件,若苹果数为0或盘子数为1,只有一种分法
for (int i = 0; i <= m; i++) {
dp[i][1] = 1;
}
for (int j = 1; j <= n; j++) {
dp[0][j] = 1;
}
// 动态规划递推计算方法数
for (int i = 1; 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][i]; // 若苹果数小于盘子数,等同于每个盘子都盛放一个苹果
}
}
}
return dp[m][n]; // 返回最终计算得到的结果
}
int main() {
int m, n;
// 读取每行输入数据,计算分法并输出结果
while (scanf("%d %d", &m, &n) != EOF) {
int result = partition_dp(m, n);
printf("%d\n", result);
}
return 0;
}