早教吧作业答案频道 -->其他-->
求算法分苹果问题输入MN,M个苹果放到N个篮子里可以有空篮子并且122和212算一种放法问一共多少种放法不需要代码只要告诉我算法就可以了谢谢啦
题目详情
求算法 分苹果问题
输入M N ,M个苹果放到N个篮子里 可以有空篮子 并且122和212算一种放法
问一共多少种放法
不需要代码 只要告诉我算法就可以了 谢谢啦
输入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
void PutApple(long nRemainApple, long nRemainBasket,
long nLevel, long nAllLevel, long * npBuffer,
long nLimit, long * npSum)
{
long k;
if (nLevel == nAllLevel-1)
{
if (nRemainApple =0; k--)
{
npBuffer[nLevel]=k;
PutApple(nRemainApple-k, nRemainBasket-1,
nLevel+1, nAllLevel, npBuffer, k, npSum);
}
}
main()
{
int nApple = 10;
int nBasket = 3;
printf("Please input apple count:");
scanf("%d", &nApple);
printf("Please input basket count:");
scanf("%d", &nBasket);
if (nApple200)
return 0;
if (nBasket30)
return 0;
long * npBuffer = new long [nBasket];
long nCount=0;
PutApple(nApple, nBasket, 0,
nBasket, npBuffer, nApple, &nCount);
delete []npBuffer;
printf("Count = %d\n", nCount);
return 0;
}
对10个苹果,3个篮子,运行结果:
Please input apple count:10
Please input basket count:3
10 0 0
9 1 0
8 2 0
8 1 1
7 3 0
7 2 1
6 4 0
6 3 1
6 2 2
5 5 0
5 4 1
5 3 2
4 4 2
4 3 3
Count = 14
Press any key to continue
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
void PutApple(long nRemainApple, long nRemainBasket,
long nLevel, long nAllLevel, long * npBuffer,
long nLimit, long * npSum)
{
long k;
if (nLevel == nAllLevel-1)
{
if (nRemainApple =0; k--)
{
npBuffer[nLevel]=k;
PutApple(nRemainApple-k, nRemainBasket-1,
nLevel+1, nAllLevel, npBuffer, k, npSum);
}
}
main()
{
int nApple = 10;
int nBasket = 3;
printf("Please input apple count:");
scanf("%d", &nApple);
printf("Please input basket count:");
scanf("%d", &nBasket);
if (nApple200)
return 0;
if (nBasket30)
return 0;
long * npBuffer = new long [nBasket];
long nCount=0;
PutApple(nApple, nBasket, 0,
nBasket, npBuffer, nApple, &nCount);
delete []npBuffer;
printf("Count = %d\n", nCount);
return 0;
}
对10个苹果,3个篮子,运行结果:
Please input apple count:10
Please input basket count:3
10 0 0
9 1 0
8 2 0
8 1 1
7 3 0
7 2 1
6 4 0
6 3 1
6 2 2
5 5 0
5 4 1
5 3 2
4 4 2
4 3 3
Count = 14
Press any key to continue
看了求算法分苹果问题输入MN,M个...的网友还看了以下:
1除以3为什么除不开1除以2就能除开,意思就是把一个东西分成两份而把一个东西一样能分成三份,但为什 2020-05-13 …
有理数的加法法则:(1)同号两数相加,取()符号,并把绝对值(有理数的加法法则:(1)同号两数相加 2020-06-18 …
你还想了解哪些动物的信息?快想办法收集并记录下来吧.如果你能发现并提出数学问题就更好了!你还想了解 2020-06-23 …
并给予算法,不甚感激~计算方式:从1斤开始计时,每秒计算一次.第二秒是上次斤数倍数.算法就是第1秒 2020-07-11 …
1.周易中的阴阳思想,举例这种思想在生活的运用.2.说说孔子一生的经历,对于他的人生选择有何看法. 2020-07-25 …
下列各项提法正确的有?1法就是统治阶级的意志.2统治阶级的意志并不能直接形成法.3统治阶级的意志只有 2020-11-27 …
邹忌讽齐王纳谏“而”作连词用时的用法:1.并列2.修饰3.承接4.转折5.因果6.假设对下面“而”的 2020-12-25 …
0.9循环化成分数是多少?我是一名初中生,学了无限循环小数化成分数的方法,可算出0.9循环等于1.有 2021-01-22 …
整式的加减,实际上就是和.进行整式加减运算的一般步骤是:(1)根据去括号法则去掉括号;(2)准确找出 2021-02-02 …
整式的加减,实际上就是和.进行整式加减运算的一般步骤是:(1)根据去括号法则去掉括号;(2)准确找出 2021-02-02 …