C++,M个苹果放N个盘子内有几种分法,允许空盘,1,5,1 、5,1,1是一种分法

2023-11-07

一个盘子可以放多个苹果,且允许空盘,那么我们可以利用递归来解题,首先可以分为几种情况,第一种,比如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种分法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++,M个苹果放N个盘子内有几种分法,允许空盘,1,5,1 、5,1,1是一种分法 的相关文章

随机推荐