例如,输入: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;
}

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

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



