原题链接:http://poj.org/problem?id=1664

思路:苹果m个,盘子n个。假设 f ( m , n ) 代表 m 个苹果,n个盘子有 f ( m , n ) 种放法。

  • 根据 n 和 m 的关系可以进一步分析:

    1. 特殊的 n = 1 || m = 1 || n = 0 时只有一种方法
    2. 当 m < n时,即使苹果每个盘子放一个也没法放满所有盘子,题目允许有的盘子空着不放,所以我们可以将空盘子去掉,即 f ( m , n ) = f ( m , m )

    3. 当 m >= n时,这时候有两种情况:
      1. n 个盘子中有一个空盘子,当有空盘子时,f ( m , n ) = f ( m , n - 1 ) ,这时候问题出现了,f ( m , n-1 ) 代表的意思是m个苹果放到n-1个盘子中,那还可能有 2 个或者 n 个空盘子呢,请看 4
      2. n个盘子中没有空盘子,当没有空盘子时也就是说每个盘子中至少有一个苹果,先把所有盘子填满,这时候会剩下 m - n 个苹果,所以现在问题变成了 m - n 个苹果放在 n 个盘子有多少种方法,即 f ( m - n , n )。
    4. 解释 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 放苹果 (递推思想)的更多相关文章

  1. POJ 1664 放苹果 (递推)

    题目链接:http://poj.org/problem?id=1664 dp[i][j]表示i个盘放j个苹果的方案数,dp[i][j] 可以由 dp[i - 1][j] 和 dp[i][j - i] ...

  2. poj 1664 放苹果(递推)

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

  3. poj 1664 放苹果 (划分数)

    题意:中文题目,不解释... 题解: 第一种方法是暴力深搜:枚举盘子1~n放苹果数量的所有情况,不需要剪枝:将每次枚举的情况,即每个盘的苹果数量,以字典序排序,然后存进set里 以此去重像" ...

  4. poj 1664 放苹果 递归

    题目链接: http://poj.org/problem?id=1664 题目描述: 有n个苹果,m个盒子,盒子和苹果都没有顺序,盒子可以为空,问:有多少种放置方式? 解题思路: 当前有n个苹果,m个 ...

  5. POJ 1664 放苹果

    放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24985   Accepted: 15908 Description ...

  6. poj 1664放苹果(递归)

    放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 37377   Accepted: 23016 Description ...

  7. poj 1664 放苹果(dfs)

    放苹果 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30284   Accepted: 19098 Description ...

  8. OpenJudge/Poj 1664 放苹果

    1.链接地址: http://bailian.openjudge.cn/practice/1664 http://poj.org/problem?id=1664 2.题目: 总时间限制: 1000ms ...

  9. POJ 1664 放苹果(递归或DP)

    一.Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t ...

随机推荐

  1. 学习整理--flex布局(1)

    父元素容器属性 flex-direction: row(默认).row-reverse.column.column-reverse row: 横向正序排列子元素 colimn: 竖向正序排列子元素 r ...

  2. Java后端高频知识点学习笔记1---Java基础

    Java后端高频知识点学习笔记1---Java基础 参考地址:牛_客_网 https://www.nowcoder.com/discuss/819297 1.重载和重写的区别 重载:同一类中多个同名方 ...

  3. Git远程操作(附重要原理图)

    原文出处: 阮一峰 Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容 ...

  4. 通过Docker部署Java项目的日志输出到宿主机指定目录

    之前写过2篇关于Docker部署的文章: 1.超!超!超简单,Linux安装Docker 2.Docker通过阿里云镜像仓库使用Gitlab_CI部署SpringBoot项目 用上篇博客部署Java程 ...

  5. 1080 - Binary Simulation

    1080 - Binary Simulation    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 64 ...

  6. 【LeetCode】712. Minimum ASCII Delete Sum for Two Strings 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  7. Morphological Image Processing

    目录 概 reflection and translation Erosion and Dilation Erosion 示例 skimage.morphology.erosion dilation ...

  8. uniapp云打包之后华为手机推送角标不显示(有推送没角标)

    小米手机上有角标,华为和OPPO没有角标 解决方法: 华为手机添加权限(可通过反编译或者离线打包添加) < uses - permission android:name="com.hu ...

  9. Java面向对象笔记 • 【第10章 Swing编程初级应用】

    全部章节   >>>> 本章目录 10.1 JFrame窗口容器 10.1.1 Swing介绍 10.1.2 JFrame窗口容器应用 JFrame常用方法 10.1.3 实践 ...

  10. Hive on Spark和Spark sql on Hive,你能分的清楚么

    摘要:结构上Hive On Spark和SparkSQL都是一个翻译层,把一个SQL翻译成分布式可执行的Spark程序. 本文分享自华为云社区<Hive on Spark和Spark sql o ...