输入M N ,M个苹果放到N个篮子里 可以有空篮子 并且122和212算一种放法
问一共多少种放法
不需要代码 只要告诉我算法就可以了 谢谢啦
求算法 分苹果问题
答案:3 悬赏:10
解决时间 2021-02-17 21:11
- 提问者网友:无依无靠的距离
- 2021-02-17 10:50
最佳答案
- 二级知识专家网友:而你却相形见绌
- 2021-02-17 11:43
算法说明太复杂,后面给你代码。简单说明:
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 <= nLimit)
{
// Find a solution !
// print result.
npBuffer[nLevel] = nRemainApple;
for (k=0; k
printf("%4d ", npBuffer[k]);
printf("\n");
(*npSum) ++;
}
return;
}
long nStart = nRemainApple;
if (nStart>nLimit) nStart = nLimit;
for (k=nStart; k>=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 (nApple<=0 || nApple>200)
return 0;
if (nBasket<=0 || nBasket>30)
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 <= nLimit)
{
// Find a solution !
// print result.
npBuffer[nLevel] = nRemainApple;
for (k=0; k
printf("\n");
(*npSum) ++;
}
return;
}
long nStart = nRemainApple;
if (nStart>nLimit) nStart = nLimit;
for (k=nStart; k>=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 (nApple<=0 || nApple>200)
return 0;
if (nBasket<=0 || nBasket>30)
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
全部回答
- 1楼网友:請叫我丶偏執狂
- 2021-02-17 13:24
你是说怎么排除122和212的情况是吧
N个篮子中苹果的总数若一样多:先将篮子里苹果按数目排序,后一个一个比较,若N个篮子的数都一样就说明是 122和212的情况,可以排除一个
- 2楼网友:抱不住太阳的深海
- 2021-02-17 13:00
这种东西要算法么?
如果只是这样分苹果,只是一个简单的组合问题
答案就是m的n次方再除以m的阶乘与n的阶乘(这是因为这题不要区分个异性)
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯