分苹果
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
Input
第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
Output
对输入的每组数据M和N,用一行输出相应的K。
Sample Input
1 7 3
Sample Output
8
#include<iostream> #include<algorithm> using namespace std; int apple(int x,int y) { if(x==0||y==1)//x苹果,y盘子 return 1; if(x<y) { return apple(x,x); } else { return apple(x,y-1)+apple(x-y,y); } } int main() { int n,a,b; cin>>n; while(n--) { cin>>a>>b; cout<<apple(a,b)<<endl; } return 0; }
x 苹果。y 盘子
讨论情况:
只有一个盘子,只有一种方案。
只有一个苹果,只有一种方案。
0个苹果。只有一种方案。
看着别人的代码。在else那想了半天才知道为啥。
如果苹果的数量大于盘子的。那么有f(n-m,m)表示先把每个盘子放一个。然后把n-m个苹果放到m个盘子里。这等价于每个盘子都放了苹果。f(n,m-1)便是当有一个空的盘子的放法。