输入 m,n,分别表示苹果数与盘子的总数,要求输出m个苹果放在 n个盘子的方法总数。

该文章介绍了一个使用递归算法解决将一定数量的苹果放入多个盘子中的方法数问题。当盘子数量大于苹果时,会递归到苹果和盘子相等的情况;当盘子数量小于等于苹果时,计算包含空盘和不包含空盘的方案数。递归出口为苹果为0或盘子为1的情况。最后给出了C++实现的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例如,输入:7 3
输出:8
递归求解

解题思路:设f(m,n)为m个苹果放到n个盘子的放法总数,先对n做讨论:
当n>m时:必定有n-m个盘子永远空着,去掉他们对摆放苹果方法总数没有影响,即if(n>m) f(m,n)=f(m,m)
当n<=m时:不同的放法可以分为两类:含有空盘的方案,不含空盘的方案
1、含空盘,即至少有一个盘子空着,即f(m,n)=f(m,n-1)
2、不含空盘,即全部盘子都有苹果,那么先从m个苹果中抽取n个每个盘子放一个,考虑剩下的m-n个苹果放到n个盘子的放法,即f(m,n)=f(m-n,n)
总的放苹果的方法数等于两种方案的方法数之和,即f(m,n)=f(m,n-1)+f(m-n,n)
递归出口条件:
当n=1时,所以苹果放到一个盘子里,返回1;
当m=0时,没有苹果可放,定义为一种放法

#include<bits/stdc++.h>
using namespace std; 
int find(int apple, int plant) //m个苹果放在n个盘子中共有几种方法
{
    if(apple==0 || plant==1)//递归出口 
        return 1;
    if(plant > apple)
        return find(apple, apple);
    else
        return find(apple, plant-1) + find(apple-plant, plant);
}
int main()
{
	int apple, plant;
	cin >> apple >> plant;
	cout<<find(apple, plant)<<endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值