例题 放苹果
把M个苹果放到N个盘子里,允许有的盘子空着不放,问共有多少种不同的分法?每个盘子都是一样的,5,1,1和1,1,5是同一种分法。
输入测试数据的数目t(0<=t<=20),然后包含M和N,1<=M,N<=10、
输出分法。
样例
1
7 3
输出
8
思路就是:
首先当盘子大于苹果时,肯定有盘子多,可以表示成当m<n,f(m,n)=f(m,m)。
然后考虑盘子小于等于苹果时,可以空着盘子也可以不空着,不空的情况就是先每个盘子都放一个,这样剩下m-n个苹果来放n个盘子(是不是又回到了盘子大于苹果的情况);空的情况就是f(m,n-1),让盘子数减去一个,就空了一个了。
总结一下
当n>m,f(m,n)=f(m,m)
当n<=m,f(m,n)=f(m,n-1)+f(m-n,n)
边界条件就是,当苹果数为0时,有一种放法,就是盘子都不放。当盘子数为0时,苹果没得放,0种放法。
代码
#include<iostream>
using namespace std;
int f(int m,int n)
{
if(m<n) return f(m,m);
if(m==0) return 1;
if(n==0) return 0;
return f(m,n-1)+f(m-n,n);
}
int main()
{
int T,m,n;
cin>>T;
while(T--)
{
cin>>m>>n;
cout<<f(m,n)<<endl;
}
return 0;
}