POJ 放苹果问题
首先我们想象有一个函数count f(m,n)可以把m个苹果放到n个盘子中。
根据 n 和 m 的关系可以进一步分析:
特殊的m <=1|| n <= 1时只有一种方法;
当 m < n时,即使苹果每个盘子放一个也没法放满所有盘子,题目允许有的盘子空着不放,所以我们可以将空盘子去掉,即 f ( m , n ) = f ( m , m );
当 m >= n时,这时候有两种情况:
n 个盘子中有一个空盘子,当有空盘子时,f ( m , n ) = f ( m , n – 1 );
n个盘子中没有空盘子,当没有空盘子时也就是说每个盘子中至少有一个苹果,先把所有盘子填满,这时候会剩下 m – n 个苹果,所以现在问题变成了 m – n 个苹果放在 n 个盘子有多少种方法,即 f ( m – n , n )。
所以当m>=n时,放置苹果的总情况为 f ( m , n – 1 )+ f ( m – n , n )次。
具体代码实现如下:
#include <iostream> using namespace std; int count(int m, int n) { if (m <=1|| n <= 1) return 1; if (m < n) return count(m, m); else return count(m, n - 1) + count(m - n, n); } int main() { int apples, plates; cin >> apples >> plates; cout << count(apples, plates) << endl; return 0; }