您的位置:首页 > 其它

[POJ] 1664 -> 放苹果

2015-04-29 08:23 190 查看
放苹果

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 27392 Accepted: 17380
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


解题思路:

我们假设苹果的总数是m,盘子的总数是n;1:如果m<n(说明苹果的总数比盘子的小),这样至少有n-m个盘子是空的,就是说每个盘子里放一个   苹果,也有盘子是空的,此时我们将n改成m,它和m个苹果,m个盘子的情况结果一样。2:如果m=0,情况数是1;3:如果n=1,情况数是1;4:如果m>=n,我们来想,要么盘子全部都有苹果,这时是f(m-n,n),要么有盘子是空的,即f(m,n-1)这样我们的递归式子就找到了f(m,n)=f(m-n,n)+f(m,n-1);

Code:

#include <iostream>
using namespace std;

int f(int m, int n){
if (m < n) return f(m, m);
if (m == 0 || m == 1 || n == 1) return 1;
return f(m - n, n) + f(m, n - 1);
}

int main()
{
int t, m, n;
cin >> t;
while (t--){
cin >> m >> n;
cout << f(m, n) << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: