递归版本
#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; }