题目: 将m个苹果放入n个篮子中,允许有篮子空着,请问一 共有几种放法?(注意:不能出现重复的放法)
输入: 第一行输入需要测试的次数t, 0<=t<=20。第二行输入苹果的数量m和篮子的数量n,1<=m,n<=10。
输出: 输出一共有几种放法。
试例: Input:
1
7 3
Output:
8
分析: 首先,苹果和篮子的关系一共有三种,m>n, m<n, m=n. 当m>n时:苹果放进篮子有两种情况,有空篮子和没有空篮 子。 有空篮子时,可以先规定有一个空篮子,则苹果的放法为placing(m,n-1),依次类推,就可得出该情况下共有几种 放法。 没有空篮子时,每个篮子至少有一个苹果,所以此时的放法为placing(m-n,n),即可得出该情况下有多少种放法。
m<n时:因为苹果的数量小于篮子的数量,所以此时一定有空篮子。所以 此时的放法和n个苹果放进n个篮子是一样的,即placing(n,n)。
m=n时: 此时也有两种情况,每个篮子里面都有一个苹果和至少有一个篮子时空的,所以此时的放法为placing(m,n-1)+1;
#include<iostream>
using namespace std;
int placing(int m,int n) //计算共有几种放法
{
if(m==1||n==1)//当只有一个苹果或只有一个篮子时,放法都是一种,即所有的苹果都放在同一个篮子里面
{
return 1;
}
else if(m>n)//当m>n时
{
return placing(m,n-1)+placing(m-n,n);
//有空篮子时的放法加上没有空篮子时的放法,有空篮子时先假设有一个空篮子后依次类推,没有空篮子时先每个篮子放一个,再将剩下的放进篮子
}
else if(m<n)
{
return placing(n,n);//m<n时的放法和n个篮子放n个苹果的放法相同
}
else if(m==n)
{
return 1+placing(m,n-1);//每个篮子放一个和至少有一个空篮子
}
}
int main()
{
int m,n;
int t;
cin>>t;
for(int i=0;i<t;i++)
{
cin>>m>>n;
cout<<placing(m,n)<<endl;
}
return 0;
}
该博客讨论了如何用递归算法解决将一定数量的苹果分配到多个篮子里的问题,其中允许篮子为空,且不考虑重复的分配方式。给出的例子展示了当有7个苹果和3个篮子时,共有8种不同的分配方法。
1185

被折叠的 条评论
为什么被折叠?



