POJ 1664 放苹果 (递推思想)
原题链接:http://poj.org/problem?id=1664
思路:苹果m个,盘子n个。假设 f ( m , n ) 代表 m 个苹果,n个盘子有 f ( m , n ) 种放法。
- 根据 n 和 m 的关系可以进一步分析:
- 特殊的 n = 1 || m = 1 || n = 0 时只有一种方法
当 m < n时,即使苹果每个盘子放一个也没法放满所有盘子,题目允许有的盘子空着不放,所以我们可以将空盘子去掉,即 f ( m , n ) = f ( m , m )
- 当 m >= n时,这时候有两种情况:
- n 个盘子中有一个空盘子,当有空盘子时,f ( m , n ) = f ( m , n - 1 ) ,这时候问题出现了,f ( m , n-1 ) 代表的意思是m个苹果放到n-1个盘子中,那还可能有 2 个或者 n 个空盘子呢,请看 4 。
- n个盘子中没有空盘子,当没有空盘子时也就是说每个盘子中至少有一个苹果,先把所有盘子填满,这时候会剩下 m - n 个苹果,所以现在问题变成了 m - n 个苹果放在 n 个盘子有多少种方法,即 f ( m - n , n )。
解释 m >= n 时最后的疑问:因为 m >= n , 所以 m >= n - 1 必然成立,也就是说 f ( m , n - 1 )这个状态也会面临两种情况,即 m >= n 时的 1 和 2,当面临 i 时可得 f ( m , n - 1 ) = f ( m , n - 2 ),所以有 2 个空盘子的情况是在 1 个空盘子前就解决了,所以现在只需要考虑 1 个空盘子的情况就好了。
- 综上所述,递推关系如下:
要点详解:
- 用函数封装功能是一个好的做法。
- 递推问题的关键有两点,一是结束条件,在数比较小时,结果往往是显而易见的;二是递推式,只要参数逐步递减,问题就解决了。
代码如下:
#include <iostream>
using namespace std;
int apple(int m, int n) {
if (m == 0 || n == 1) return 1;
else if (n > m) return apple(m, m);
else return apple(m-n, n) + apple(m, n-1);
}
int main() {
int t, m, n;
cin >> t;
while (t--) {
cin >> m >> n;
cout << apple(m, n) << endl;
}
return 0;
}
参考链接:POJ 放苹果(递推关系)
POJ 1664 放苹果 (递推思想)的更多相关文章
- POJ 1664 放苹果 (递推)
题目链接:http://poj.org/problem?id=1664 dp[i][j]表示i个盘放j个苹果的方案数,dp[i][j] 可以由 dp[i - 1][j] 和 dp[i][j - i] ...
- poj 1664 放苹果(递推)
题目链接:http://poj.org/problem? id=1664 放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions ...
- poj 1664 放苹果 (划分数)
题意:中文题目,不解释... 题解: 第一种方法是暴力深搜:枚举盘子1~n放苹果数量的所有情况,不需要剪枝:将每次枚举的情况,即每个盘的苹果数量,以字典序排序,然后存进set里 以此去重像" ...
- poj 1664 放苹果 递归
题目链接: http://poj.org/problem?id=1664 题目描述: 有n个苹果,m个盒子,盒子和苹果都没有顺序,盒子可以为空,问:有多少种放置方式? 解题思路: 当前有n个苹果,m个 ...
- POJ 1664 放苹果
放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 24985 Accepted: 15908 Description ...
- poj 1664放苹果(递归)
放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 37377 Accepted: 23016 Description ...
- poj 1664 放苹果(dfs)
放苹果 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 30284 Accepted: 19098 Description ...
- OpenJudge/Poj 1664 放苹果
1.链接地址: http://bailian.openjudge.cn/practice/1664 http://poj.org/problem?id=1664 2.题目: 总时间限制: 1000ms ...
- POJ 1664 放苹果(递归或DP)
一.Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t ...
随机推荐
- postgresql很强大,为何在中国,mysql成为主流?
你找一个能安装起来的数据库,都可以学,不管什么版本. 数据库的基本功,是那些基本概念(SQL,表,存储过程,索引,锁,连接配置等等),这些在任何一个版本中都是一样的. 目录 postgresql很强大 ...
- 录入任务信息(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 日历设置好了,就该录入任务了.当然在录入任务之前还要对任务进行一下面分解,就是一个项目,要分几个大步完成,每个大步又分几个 ...
- M语言中的引用(Power Query 之 M 语言)
名词 查询表 函数 行{}/列[] 单元格 表(Table) 列表(List) 记录(Record) 引用[查询表] =查询表表名 引用[应用的步骤] =步骤名 引用表中的[单元格](深化) =表{行 ...
- Java 常用类库一,main方法传参String[] args;获取输入Scanner ;hasNext();hasNextInt()
1. main方法传参 package com.zmd.common_class_libraries; /** 给mian方法传参测试 */ public class MainArgsTest { p ...
- tomcat Address already in use: JVM_Bind
运行多个tomcat时,出现tomcat Address already in use: JVM_Bind这个错误,可以按照如下方式解决: 修改F:\tomcat20111101\apache-tom ...
- yarn 过程中遇到的问题
场景 项目中打包遇到了点问题,所以想删除原先装好的依赖包,重新yarn,结果神奇的报错了,无语... 遇到的问题 (1)error An unexpected error occurred: &quo ...
- JAVA获取当前日期指定月份后(多少个月后)的日期
环境要求:使用jdk1.8 package com.date; import java.text.ParseException; import java.text.SimpleDateFormat; ...
- google protobuf学习笔记:windows下环境配置
欢迎转载,转载请注明原文地址:http://blog.csdn.net/majianfei1023/article/details/45371743 protobuf的使用和原理,请查看:http:/ ...
- 【LeetCode】283. Move Zeroes 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:首尾指针 方法二:头部双指针+双循环 方法三 ...
- 【LeetCode】121. Best Time to Buy and Sell Stock 解题报告(Java & Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 C++ 解法 日期 ...