放苹果
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 31892 | Accepted: 20055 |
Description
把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
解题:
qq1454739651 AR/VR开发请联系
/*
设f(m,n)代表m个苹果放在n个盘子里的方案数,讨论的递推结果为:
m=1 或n=1,那么无论只有一个苹果还是一个盘子,都只有一种方案,即放在任意一个盘子里或所有苹果放在唯一
一个盘子里。 f(m,n)=1
m<n, f(m,n)=f(m,m)
m=n, 放满只有一种方式,放不满时,如果只有一个盘子不妨,那么等同于f(m,n-1)
∴ f(m,n)=1+f(m,n-1)
m>n, 放满时,可以等同为先从m中取n个,分别放入n个盘子里一盘子一个,然后m-n苹果放入n个盘子,如果不放
满,那么至少剩一个空盘,等同f(m,n-1)
∴ f(m,n)=f(m-n,n)+f(m,n-1)
*/
#include <iostream>
#include <stdio.h>
using namespace std;
int solve(int m,int n){
if(m==1||n==1)return 1;
else if(m<n)return solve(m,m);
else if(m==n)return 1+solve(m,n-1);
else return solve(m-n,n)+solve(m,n-1);
}
int main()
{
int t,temp1,temp2; //输入的组数
cin>>t;
for(int i=1;i<=t;i++){
cin>>temp1>>temp2;
cout<<solve(temp1,temp2)<<endl;
}
return 0;
}