一个盘子可以放多个苹果,且允许空盘,那么我们可以利用递归来解题,首先可以分为几种情况,第一种,比如m=1 或者n=1 这种情况只能有一种分法。
第二种,比如M<N 也就是盘子多于苹果数 我们自己可以列举一下例子比如有3个苹果 5个盘
那么可以分为3 0 0 0 0 ,1 1 1 0 0,2 1 1 0 0,三种情况 ,但是细心一点会发现无论盘子比
苹果多多少可以分的种类和苹果和盘子一样多能分的种类一模一样。
第三种 ,也就是M>N 的情况 比如有7个苹果 3个盘子,该怎么分呢?
如果分没有空盘的情况,我们可以先把每个盘子都放上一个苹果在进行分,分后我们还有4个苹果,要分3个盘子,所以要继续进行分苹果这个过程 此时是4个苹果分3个盘子,继续分下去可以得到还有1个苹果 3个盘子此时满足第一种情况不能继续分下去了 此时我们要考虑一下空盘的分法,空一个盘,空两个盘,直到盘子只剩一种的情况,所以此时可以在分成两份
可以列一个图 (比较潦草,凑合看)
等两个路都有一个M或者N等于1的情况也就结束了,所以有了上面的分析,我们就可以进行下列的编程了。
#include <iostream>
using namespace std;
int fun(int m, int n)
{
if (m == 1 || n == 1 || m == 0)//注意此时要考虑m=0的情况 因为m-n可能为0
return 1;
if (m < n)
return fun(m, m);
else
return fun(m, n - 1) + fun(m - n, n);
}
int main()
{
int m, n,a;
cin >> m>> n;
a = fun(m, n);
cout << a << endl;
}
例子:输入7个苹果 3个盘子
得到8种分法