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