用“分治算法”解决“放苹果问题”

题目:

把N个同样的苹果放在M个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

Input

第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

Output

对输入的每组数据N和M,用一行输出相应的K。

Sample Input

1

7 3

Sample Output

8

思路:

n个苹果放在m个盘子里,记为C(n,m),可递归为C(n,m-1)+C(n-m,m)。C(n,m-1)表示n个苹果放入m-1个盘子的情况;而C(n-m,m)则表示n个苹果放满m个盘子,之所以为“n-m”,是因为先把n个苹果每个盘子都放一个,所以就剩下n-m个苹果。

但是,当“m>n”时,n个苹果无法放满m个盘子,所以此时只需“return c(n,n-1)”

接下来在考虑分解条件,当“n<=1||m<=1”时,只有一种情况,故 return 1;

综上所述,可得以下表达式:

n<=1或m<=1       return 1;
m>n                     return c(n,n-1);
m<=n                   return c(n,m-1)+c(n-m,m);

接下来就是代码:

//From Big_Heart
#include <iostream>
using namespace std;
int c(int ,int );
int i=0;
void main(){
	int n,m,count=0;
	cin>>count;
	while(count--){
		cin>>n>>m;
		cout<<c(n,m)<<endl;
	}
}
int c(int n,int m){
	if(n<=1||m<=1)
		return 1;
	if(m>n)
		return c(n,n-1);
	else
		return c(n,m-1)+c(n-m,m);
}

转载请写明出处:http://blog.csdn.net/u013797947

点赞