求算法 分苹果问题

来源:百度知道 编辑:UC知道 时间:2024/05/30 02:51:13
输入M N ,M个苹果放到N个篮子里 可以有空篮子 并且122和212算一种放法

问一共多少种放法

不需要代码 只要告诉我算法就可以了 谢谢啦

算法说明太复杂,后面给你代码。简单说明:
122 212 221是同种方法,则取代表 221
123 。。。321 是同种方法,则取代表 321
能当“代表”的组合的特点是,前面的不小于后面的。
这是一个限制条件。

想来想去用递归最好。
比如10个放入3个篮子,变成:
第一个放10,再把0个放入剩余2个篮子
第一个放9,再把1个放入剩余2个篮子
第一个放8,再把2个放入剩余2个篮子
第一个放7,再把3个放入剩余2个篮子
。。。。

总之,M个苹果,N个篮子,
第一个放a个,a的范围是从M减小到0,
而再将(M-a)个苹果放入N-1个篮子。

但是放的时候要一定满足“前面的不小于后面的”。
代码:

#include<stdio.h>

void PutApple(long nRemainApple, long nRemainBasket,
long nLevel, long nAllLevel, long * npBuffer,
long nLimit, long * npSum)
{
long k;
if (nLevel == nAllLevel-1)
{
if (nRemainApple <= nLimit)
{
// Find a solution !
// print result.
npBuffer[nLevel] = nRemainApple;
for (k=0; k<nAllLevel; k++)
printf("%4d ", npBuffer[k]);
printf("\n");
(*npSum) ++;
}
return;
}

long nStart