#include<iostream>
#include<cstdio>
using namespace std;
/*
* m为苹果数,n为盘子数(m,n)表示总的放法
* 则可知:
* if(m>=n)即苹果数目多
* 没有盘子空的放法为(m-n,n)
* 有盘子空的放法为f(m,n-1)+f(m,n-2)+...+f(m,1)
* 从而有
* (m,n)=(m-n,n)+f(m,n-1)+...+f(m,1)
* 其中f(m,n)表示m个苹果放在个盘子上不允许为空也即是f(m,n)=(m-n,n)
* if(m<n)即盘子数目多
* 此时和m=n时的情况等价
*/
int apple(int m,int n){
if(n==1)
return 1;
else if(m<0)
return 0;
else if(m==1||m==0)//m=0时也是一种
return 1;
else{
return apple(m-n,n)+apple(m,n-1);// apple(m-n,n)表示没有空盘子,apple(m,n-1)表示剩下一个空盘子,进行递归
}
}
int main(){
int t;
int m,n;
while(scanf("%d",&t)!=EOF){
for(int i = 1;i<=t;i++){
scanf("%d%d",&m,&n);
printf("%d\n",apple(m,n));
}
}
}
北大1160,放苹果,分治法
最新推荐文章于 2018-07-26 10:24:27 发布