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 ...
随机推荐
- ciscn_2019_es_1
拿到题目例行检查 将题目放到idax64中进行代码审计 主界面,我也没看懂什么意思 call 可以看到free的指针没有置零,存在uaf漏洞 add函数 show函数 该题的libc版本是2.27,所 ...
- [BUUCTF]PWN5——ciscn_2019_n_1
[BUUCTF]PWN5--ciscn_2019_n_1 题目网址:https://buuoj.cn/challenges#ciscn_2019_n_1 步骤: 例行检查,64位,开启了nx保护 nc ...
- VirtualBox 同时添加 NAT 和 Host-Only 网卡出现无法上网的情况
如果网卡1是 NAT,网卡2是 Host-Only,可以 ping 通 baidu.com. 如果网卡1是 Host-Only,网卡2是 NAT,无法 ping 通 baidu.com. 使用 nmc ...
- CF94A Restoring Password 题解
Content 有一个 \(80\) 位的 \(01\) 字符串,由 \(8\) 个长度为 \(10\) 的 \(01\) 字符串组成,每个小字符串分别对应一个数字.现在,给出这个字符串和 \(0\) ...
- myeclipse 给类与方法添加注解模板方法
myeclipse 给类与方法添加注解模板方法 步骤1:点击myeclipse 界面的[Window]菜单 步骤2:点击下拉菜单的[Preferences]选项 步骤3:展开左边菜单的[java]选项 ...
- More Effective C++ 基础议题(条款1-4)总结
More Effective C++ 基础议题(条款1-4)总结 条款1:仔细区别pointers和references 如果有一个变量,其目的是用来指向(代表)另一个对象,但是也有可能它不指向(代表 ...
- Spring Tool Suite(STS)基本安装配置
下载jar包:https://spring.io/tools 下载完成后 打开所在文件夹 执行命令行 jar -jar 下载的jar包文件名 然后会自动解压 双击打开软件 配置主面板窗口 配置好之后 ...
- FastAPI(六十五)实战开发《在线课程学习系统》基础架构的搭建
在之前三篇,我们分享的就是需求的分析,基本接口的整理,数据库链接的配置.这次我们分享项目的基本框架,目录结构如下: common目录 通用的目录,一些通用的处理放在这里 models目录 数据库相关的 ...
- MFC中使用qt演练
链接 这里 note but , I dont guess that works in qt5
- c++之快速排序改进(随机值)
数量少(5~25),插入排序很高效 一个影响快排效率的因素就是: 基准值的选择 本文将演示一种随之法的快排 改进前 void quick_sort5(int arr[], int low, int h ...