总时间限制:

1000ms

内存限制:

65536kB

描述

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

输入

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

输出

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

样例输入

1
7 3

样例输出

8

这个题目采用递归解决,我们首先对于问题分析一下,如果盘子的数目大于苹果的数目,那肯定要有一些盘子是什么也不放的。

所以还剩下 n-m 个盘子,其余的盘子都是一样的,所以不做处理。

然后对问题进行分类,要么就有盘子不放苹果,要么就在每个盘子上面全放上苹果。

对于这两种情况:不放苹果的话就 return f(m,n-1),然后这个递归就会从盘子数目从1到n-1递归求解有多少种 方案数。

这个过程实际上是先求当前的  有的不放  +  所有都放  的情况,然后要求这个就要先求之前的  有的不放  +  所有都放  的数目,直到回到递归的边界条件得到一个确定的值,这时候边界的值就知道了,是一个确定的数,那上一层的递归就也可以通过一个确定的数相加得到确定的值,假设上一层是有两个递归的的,,一个  有的不放  ,一个  所有都放  。所以最底层的边界就要有四个值,每个递归两个。其实这样的话,这一层就已经相当于是最顶层了,这就是要求的结果了,因为,每次递归下去都是二层递归, 所以当递归数目为2的时候,就是最顶层了。

至于所有都放,自己体会一下。

说完了问题的分类,就该说递归的终止了,因为题目允许盘子不放入苹果,所以,当苹果数目为零,但是盘子数目不为零的时候,他的方案数就为 1 。

但是当盘子的数目为零的时候,就没有方案数了,就是零。

注意递归的求解就是一定要有边界条件。

#include <iostream>
using namespace std;
int f(int m,int n)
{
if (n>m)
return f(m,m);
if (m==0)
return 1;
if (n==0)
return 0;
return f(m,n-1)+f(m-n,n);
}
int main()
{
int t;
int m,n;
cin>>t;
while (t--) {
cin>>m>>n;
cout<<f(m,n)<<endl;
}
return 0;
}

最新文章

  1. hdu1695 GCD(莫比乌斯反演)
  2. 修改eclipse的自动完成功能
  3. centos6.4安装Apache+MySQL+PHP
  4. android CheckBox的运用
  5. 敏捷软件开发(3)---COMMAND 模式 &amp; Active Object 模式
  6. linux rdsktop 运程管理 windows
  7. hdu 2275 Kiki &amp; Little Kiki 1
  8. linux使用:vi编辑器
  9. sql,mybatis,javascript分页功能的实现
  10. UVALIVE 5893 计算几何+搜索
  11. 火狐Firefox 浏览器 onblur() 并且alert()时文本被选中问题
  12. vim cheat sheet
  13. Java经典编程题50道之十二
  14. WKWebView 官方文档
  15. MySQL基础语法命令
  16. LeetCode 112. Path Sum (二叉树路径之和)
  17. this的指向问题
  18. Python测试远程端口连接时间
  19. 【bzoj 3306】树
  20. 回顾:Linux环境 Mysql新建用户和数据库并授权

热门文章

  1. 洛谷 - P2261 - 余数求和
  2. poj1564
  3. 当打开一个.h或.cpp文件时, Solution Explorer就自动展开文件所在的目录
  4. ErrorObject OpenAsync(Action&lt;ErrorObject&gt;arg_fnRet)
  5. IT兄弟连 JavaWeb教程 经典面试题3
  6. 安装kibana
  7. 51Nod 1092 回文字符串
  8. C++ typedef typename 作用
  9. 线段树(单点更新) HDOJ 4288 Coder
  10. 题解报告:hdu 1392 Surround the Trees(凸包入门)