北大1160,放苹果,分治法

#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));
	 }
   }    
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值