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

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

题目:

把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);

接下来就是代码:

[cpp]  view plain copy
  1. //From Big_Heart  
  2. #include <iostream>  
  3. using namespace std;  
  4. int c(int ,int );  
  5. int i=0;  
  6. void main(){  
  7.     int n,m,count=0;  
  8.     cin>>count;  
  9.     while(count--){  
  10.         cin>>n>>m;  
  11.         cout<<c(n,m)<<endl;  
  12.     }  
  13. }  
  14. int c(int n,int m){  
  15.     if(n<=1||m<=1)  
  16.         return 1;  
  17.     if(m>n)  
  18.         return c(n,n-1);  
  19.     else  
  20.         return c(n,m-1)+c(n-m,m);  
  21. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值