【华为机试】鸡蛋放在篮子里

我自己描述为鸡蛋和篮子问题

描述

题目描述

把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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值