放苹果
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. SQL觸發器聯級刪除

    Create TRIGGER [dbo].[trigInstructionsDelete] ON dbo.Instructions instead OF DELETE AS BEGIN DECLARE ...

  2. 浅析angular框架的cookie

    相信接触过网页编程的基本上都知道cookie这个东西吧,一个毫不起眼,但是又十分的重要的东西,今天我们就来分析一下这个小东西,我们都知道客服端通过发送http请求到服务器请求我们的数据,当我们的服务器 ...

  3. Builder 模式

    Builder 模式和 AbstractFactory 模式在功能上很相似,因为都是用来创建大的复杂的对象,它们的区别是:Builder 模式强调的是一步步创建对象,并通过相同的创建过程可以获得不同的 ...

  4. SGU 160.Magic Multiplying Machine

    时间限制:0.5s 空间限制6M 题意:        给出n个(1<=n<=10000)1~m(2<m<1000)范围内的数,选择其中任意个数,使它们的 乘积 模m 最大,输 ...

  5. Codeforces 474F - Ant colony

    注意到每个区间生存下来的蚂蚁的长度等于区间的gcd 于是可以先预处理出区间的gcd 然后二分查找就好了 预处理gcd我这里用的是倍增法 总的时间复杂度O(NlogN) /* Cf 271F 倍增求区间 ...

  6. 『重构--改善既有代码的设计』读书笔记----Self Encapsulate Field

    如果你直接访问一个字段,你就会和这个字段直接的耦合关系变得笨拙.也就是说当这个字段权限更改,或者名称更改之后你的客户端代码都需要做相应的改变,此时你可以为这个字段建立设值和取值函数并且只以这些函数来访 ...

  7. 小心DriveInfo类IsReady属性的较大延迟问题

    当某些驱动器调用IsReady属性来判断是否准备好时,会有性能问题,会非常慢,特别是网络驱动器断开的时候,这个属性会有30秒左右的延迟,这对程序执行是非常大的开销,请慎重调用

  8. 翻译-让ng的$http服务与jQuerr.ajax()一样易用

    Make AngularJS $http service behave like jQuery.ajax() 让ng的$http服务与jQuerr.ajax()一样易用 作者zeke There is ...

  9. 用Web Picasa API搭建站内相册

    在flickr时代,为了专门把站内嵌入相册,还专门写了一篇文章把Flickr相册搬回家.flickr被墙之后,我就把个人相册转到了Web Picasa上.用Picasa Web就简单多了,官方提供了S ...

  10. bzoj2215: [Poi2011]Conspiracy

    Description Byteotia的领土被占领了,国王Byteasar正在打算组织秘密抵抗运动.国王需要选一些人来进行这场运动,而这些人被分为两部分:一部分成为同谋者活动在被占领区域,另一部分是 ...