我自己描述为鸡蛋和篮子问题
描述
题目描述
把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
数据范围:0<=m<=10,1<=n<=10。
本题含有多组样例输入。
输入描述:
输入两个int整数
输出描述:
输出结果,int型
示例1
输入:
7 3
输出:
8
牛客一位大神的代码;我盯着代码琢磨了一下午才看明白,现在加上自己的注释。
使用递归,保证每个篮子最少一个鸡蛋,从第一个篮子到最后一个篮子的分法种类,累加。那么就需要留出篮子数量的鸡蛋用来“保底”,这样才能在此基础上调用允许空篮子的分法函数。
#include <iostream>
#include <string>
using namespace std;
int getValue(int egg, int basket)
{
int chan = 0;
if (egg == 0 || egg == 0) //没有鸡蛋或者没有篮子
return 0;
if (egg == 1 || basket == 1) //只有一个鸡蛋或者一个篮子
return 1;
//依次计算每次i个篮子全部放有鸡蛋条件下的分法,不能有空篮子
for (int i = 1; i <= basket; i++)
{
//如果鸡蛋数egg小于或等于篮子数basket,当遍历到第egg个篮子时,
//所有篮子里面1个鸡蛋,只有1种分法无需计算,直接++
//此时遍历完毕跳出,后面空篮子无需遍历(与此时情况属于同一种分法)
if (egg == i)
{
chan++;
break;
}
//需要保证每个篮子里面都有鸡蛋,那么每个篮子里面最少1个鸡蛋
//1个篮子也需要留1个鸡蛋打底,剩余egg-1个鸡蛋和1个篮子参与getValue运算
//那么计算i个篮子都有鸡蛋的分法,就要减去i个保底鸡蛋数
//剩余只有egg-i个鸡蛋可以正常调用getValue函数,因为getValue是包括空篮子的全条件考虑的
chan += getValue(egg - i, i); //egg-i个鸡蛋正常放入i个篮子里面的分法数量(允许空篮子)
}
return chan;
}
int main()
{
int egg, basket;
while (cin >> egg)
{
cin >> basket;
cout << getValue(egg, basket) << endl;
}
return 0;
}