poj1664 (递归)
| Time Limit: 1000MS | Memory Limit: 10000K | |
| Total Submissions: 31295 | Accepted: 19742 |
Description
Input
Output
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 (递归)的更多相关文章
- 放苹果(poj1664递归)
ti放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24392 Accepted: 15513 Descripti ...
- poj1664放苹果(递归)
题目链接:http://poj.org/problem?id=1664 放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: ...
- poj1664 放苹果(递归)
转载请注明出处:http://blog.csdn.net/u012860063?viewmode=contents 题目链接:http://poj.org/problem?id=1664 ------ ...
- poj1664 放苹果(DPorDFS)&&系列突破(整数划分)
poj1664放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 33661 Accepted: 20824 Desc ...
- poj1664 dp记忆化搜索
http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...
- .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]
方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...
- 算法笔记_013:汉诺塔问题(Java递归法和非递归法)
目录 1 问题描述 2 解决方案 2.1 递归法 2.2 非递归法 1 问题描述 Simulate the movement of the Towers of Hanoi Puzzle; Bonus ...
- Android 算法 关于递归和二分法的小算法
// 1. 实现一个函数,在一个有序整型数组中二分查找出指定的值,找到则返回该值的位置,找不到返回 -1. package demo; public class Mytest { public st ...
- 二叉树的递归实现(java)
这里演示的二叉树为3层. 递归实现,先构造出一个root节点,先判断左子节点是否为空,为空则构造左子节点,否则进入下一步判断右子节点是否为空,为空则构造右子节点. 利用层数控制迭代次数. 依次递归第二 ...
随机推荐
- 在线预览文件(pdf)
1.flash版(借助flexpaper工具) 可以把pdf文件用pdf2swf工具转换成swf文件.下载地址http://www.swftools.org/download.html 转换代码如下: ...
- Orace数据库锁表的处理与总结<摘抄与总结三>
当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误. TX锁等待的分析 Oracle数据库中一般使用行级锁. 当Oracle ...
- javascript社交平台分享-新浪微博、QQ微博、QQ好友、QQ空间、人人网
整理的五个社交平台的分享 <!doctype html> <html lang="en"> <head> <meta charset=&q ...
- C# 枚举
一.在学习枚举之前,首先来听听枚举的优点. 1.枚举能够使代码更加清晰,它允许使用描述性的名称表示整数值. 2.枚举使代码更易于维护,有助于确保给变量指定合法的.期望的值. 3.枚举使代码更易输入. ...
- SpringMVC4+thymeleaf3的一个简单实例(篇四:form表单数据验证)
关于表单数据验证有很多中方法,这里我仅介绍JSR303注解验证.JSR303仅仅是一个规范,这里我们要用到它的一个实现:hibernate-validator. 注意在spring的配置文件sprin ...
- confluence5.8.10的使用
之前在windows上安装了confluence5.8.10,结果有一天知什么缘故,数据库数据损坏,知识库彻底打不开了,所有的文档都付之东流,真的不是一般心痛.因此考虑将其装到linux机器上,因为t ...
- 【转载】详细解读C#中的 .NET 弱事件模式
你可能知道,事件处理是内存泄漏的一个常见来源,它由不再使用的对象存留产生,你也许认为它们应该已经被回收了,但不是,并有充分的理由. 在这个短文中(期望如此),我会在 .Net 框架的上下文事件处理中展 ...
- HTML5 Canvas画数字时钟
先不说废话,没代码算个蛋. 一些地方注释都写得比较清楚,不过这只是部分,因为只有秒针,但是时针,分针的逻辑都是一致的. 代码中有些坐标不知道为什么较不准,看看就好
- 我的css reset
@charset "utf-8"; /*reset*/ body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,f ...
- Win7系统下完全删除Mysql
今天不知为什么Mysql服务器突然连接不上,于是胡乱折腾了一番,导致最后不得不重新安装Mysql.安装不成功,服务器起不来,就是最后那步的时候服务器启动不了,这是因为Mysql在卸载的时候没有彻底卸载 ...