放苹果
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 31295   Accepted: 19742

Description

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

Input

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

Output

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

Sample Input

1
7 3

Sample Output

8

思路:
首先对于给定的m和n,我们一步步的分析他们的大小关系,然后抽象出一个结论。
(1.1)如果m>n,也就是苹果的数量比盘子要多,则所有的可能性便是将所有苹果放在1个盘子的可能情况个数s1,2个盘子的可能情况个数s2...n个盘子的可能情况个数sn
(1.2)如果m<=n,也就是苹果的数量比盘子要少,则所有可能性便是将所有苹果放在1个盘子的可能情况个数s1,2个盘子的可能情况个数s2...m个盘子的可能情况个数sn
基于m和n的情况,我们便能理解main函数中的for循环和min(m,n)的含义了,后者其实就是找出苹果能分成的最大块数
然后看f函数,它的含义是求将m个苹果正好分到x个盘子里,有几种可能性。那么它一共会面临3种情况
(2.1)当m=x,也就是将m个苹果正好分到m个盘子里,那当然只有一种可能性了,就是一个盘子一个
(2.2)当m>x,也就是苹果的数量多于盘子的数量,这里的分析是解决本题的关键。
我们可以将m个苹果正好分到1个、2个、3个...x个盘子里,用一个循环变量i来表示这个数,那么我们在每个盘子占了一个位置之后,就会剩下m-i个苹果,那现在的问题不就转换成了剩下的这m-i个苹果正好分配到i个盘子里一共有集中可能分法么?于是我们的递归就出来了。
(2.3)当m<x,也就是将m个苹果正好分到x个盘子里,而且x还大于m——这明显是不可能的,所以为0。举个例子,有3个苹果,让你正好分到5个盘子里,正好分到的意思是每个盘子至少一个,现在你能给我有几种分发?

#include <iostream>
using namespace std; int f(int m,int x)
{//将数字m分成x个"条"
if(m < x) return ;
else if(m == x) return ;
else {
if(x == ) return ;
int ans = ;
for(int i = ;i <= x;i++)
ans += f(m-x,i);
return ans;
}
} int main()
{
int m,n;
int t;
cin>>t;
while(t--)
{
cin>>m>>n;
int ans = ;
for(int i = ;i <= min(n,m);i++)
ans += f(m,i);
cout<<ans<<endl;
}
return ;
}

poj1664 (递归)的更多相关文章

  1. 放苹果(poj1664递归)

    ti放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24392   Accepted: 15513 Descripti ...

  2. poj1664放苹果(递归)

    题目链接:http://poj.org/problem?id=1664 放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: ...

  3. poj1664 放苹果(递归)

    转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=1664 ------ ...

  4. poj1664 放苹果(DPorDFS)&&系列突破(整数划分)

    poj1664放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 33661   Accepted: 20824 Desc ...

  5. poj1664 dp记忆化搜索

    http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...

  6. .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]

    方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...

  7. 算法笔记_013:汉诺塔问题(Java递归法和非递归法)

    目录 1 问题描述 2 解决方案  2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...

  8. Android 算法 关于递归和二分法的小算法

     // 1. 实现一个函数,在一个有序整型数组中二分查找出指定的值,找到则返回该值的位置,找不到返回 -1. package demo; public class Mytest { public st ...

  9. 二叉树的递归实现(java)

    这里演示的二叉树为3层. 递归实现,先构造出一个root节点,先判断左子节点是否为空,为空则构造左子节点,否则进入下一步判断右子节点是否为空,为空则构造右子节点. 利用层数控制迭代次数. 依次递归第二 ...

随机推荐

  1. memcached和mongodb 在windows下安装

    要在新机器上安装memcached和mongodb服务,折腾了一天,终于把这两个服务在windows下跑起来了. memcached主要参考http://www.rootop.org/pages/27 ...

  2. PHP 进行统一邮箱登陆的代理实现(swoole)

    在工作的过程中,经常会有很多应用有发邮件的需求,这个时候需要在每个应用中配置smtp服务器.一旦公司调整了smtp服务器的配置,比如修改了密码等,这个时候对于维护的人员来说要逐一修改应用中smtp的配 ...

  3. jquery选择器的使用方式

    1.基本选择器   选择器 描述 返回 示例 代码说明 1 id选择器 根据指定的id匹配元素 单个元素 $("#one").css("background", ...

  4. JAVA开发环境 - 环境变量及配置

    JDK是什么?JRE是什么? JRE(Java Runtime Environment):Java运行环境: JDK(Java Development Kit):Java开发工具包,里面已经包含JRE ...

  5. Flyweight 模式

    如果一个应用程序使用了太多的对象, 就会造成很大的存储开销. 特别是对于大量轻量级 (细粒度)的对象,比如在文档编辑器的设计过程中,我们如果为每个字母创建一个对象的话,系统可能会因为大量的对象而造成存 ...

  6. js创建对象的三种方法:文本标识法和构造器函数法和返回对象的函数

    文本标识法和定义变量差不多,像这样 var obj = {name:'HanMM','2':'Dali'}; 函数构造器法  先创建一个对象函数 function Obj() { this.addre ...

  7. php中判断变量是否为空

    从数据库中取出值后判断是否为空,这个看起来很简单,只要和null比较一下就可以了,其实不然, if($obj==null){ } 这样写会报错的:Notice: Trying to get prope ...

  8. 【技术宅6】把一个无限级分类循环成tree结构

    function list_to_tree($list,$root=0,$pk='cid',$pid = 'pid',$child = '_child'){ if(is_array($list)) { ...

  9. Linux系统上使用php获取apk信息

    最近在做一个apk商城,需要在用户上传了apk之后系统自动读取apk信息(包名,版本号等),后台语言使用的是php,需要php去调用系统的aapt命令去读取apk信息,在Linux系统上安装aapt的 ...

  10. Android 之夜间模式(多主题)的实现

    引言 夜间模式其实属于多主题切换的一种,不过是最麻烦的一种.因为在夜间模式下不仅要切换主色调,次要色调等等,还要覆盖一些特殊的颜色,因为在夜间模式下总不能什么都是黑的把,那不得丑死-.-,所以当你夜间 ...