动态规划问题
放苹果是一道典型的DP问题,这道题采用递归+分治+DP的方式解决。

题目描述

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

输入描述

每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

输出描述

对输入的每组数据M和N,用一行输出相应的K。
实例
输入:7 3
输出:8
思路
首先把问题归纳到动态规划类型上,那么就要考虑状态是如何转移的呢?
我们这里定义函数dp(m,n),其中m代表苹果数目,n代表盘子数目。

  1. 当M<N时,这个时候代表苹果数目小于盘子数目,也就意味着多余的N-M的盘子是没有任何所用的(这里举个简单的例子,假如只有一个苹果和三个盘子,那我这个苹果放在哪个盘子上都只算一种,因为盘子是相同的),这时候方法数目就等于dp(M,M),也就是M个苹果和M个盘子的摆放方法数目。
    所以dp(M,N)=dp(M,M)

  2. 当M>=N时,这个时候代表苹果数量要大于盘子数目,这个时候就要分情况:
    ①当每个盘子放苹果的数目都减少一,和现在情况是一样的,
    即dp(M-N,N).
    ②这么多苹果对应的盘子数目减一,对应的就是dp(M,M);
    那么dp(M,N)=dp(M-N,N)+dp(M,N-1)
    这里运用到了分治的思想

  3. 接下来就是考虑递归的出口条件了。
    ①对于盘子数量为1的情况,显然摆放数量也只有一种。
    ②对于苹果数量等于0的情况。也要返回1,这里举个最简单的例子,假如有两个苹果和两个盘子,按照上述2.的思路,那么就要返回dp(0,2)+dp(2,1),对应的就是两个苹果放在两个盘子和两个盘子上都没有情况数目均为1,而一个盘子上放两个苹果答案也是1.
    代码:

#include<iostream>
#include<cstdio>
using namespace std;
int  dp(int m,int n){if(n==1)    return 1;if(m==0)    return 1;if(m>=n)    return dp(m,n-1)+dp(m-n,n);else    return dp(m,m);
}
int main(){int m,n;while(scanf("%d%d",&m,&n)!=EOF){printf("%d\n",dp(m,n));}return 0;
}

这里代码量很少,在上面也讲述很清楚了,所以就不加注释了。
从这道题可以看出,递归、分治、动态这三个大杀器经常是同时使用的,同时他们也是算法中复杂的地方,需要经常练习,积累经验,而不是简单知道三个方法是怎么用就完了。

放苹果———动态规划中的划分数问题相关推荐

  1. POJ-1664 放苹果 动态规划思想解组合数学

    该题说明了状态开设的意义一样,但是从哪个方向去理解推倒状态的转移对解题非常关键.该题扣住是否所有的盘子中有空盘子,就得到了一个非常简单且优美的方程.如果从当前盘子的放置状态或者是当前苹果的放置状态来求 ...

  2. [POJ1664] 放苹果 (动态规划,组合数学)

    题目描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发(5,1,1和1,1,5是同一种方法) 输入输出格式 输入格式: 第一行是测试数据的数目t(0 <= ...

  3. C++——放苹果(动态规划)

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

  4. 【放苹果】m个苹果放到n个盘子中

    m个相同的苹果,放在n个相同的盘子中,由于相同,使用排列组合的方法不好处理.这里选用递归调用的方式解决问题: (8个苹果,放在3个盘子里)= (8个苹果,放在2个盘子) +(5个苹果,放在2个盘子[每 ...

  5. P、V操作与c++代码实现爸爸放苹果,妈妈放桔子,两个儿子专吃盘子中桔子,两个女儿专吃盘子中苹果问题

    二.吃水果综合设计 桌子上有一只盘子,最多可容纳两个水果,每次只能放入或取出一个水果.爸爸专向盘子放苹果(apple),妈妈专向盘子中放桔子(orange):两个儿子专等吃盘子中的桔子,两个女儿专等吃 ...

  6. 从放苹果问题到零钱兑换问题(动态规划)

    放苹果问题 题目描述 把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 数据范围:0<=m<=10,1 ...

  7. poj1664(放苹果)

    题目链接:http://poj.org/problem?id=1664 关于放苹果的那些事.......... 今天偶然看到一个关于整数划分的算法, 仔细看了后,我想到了放苹果的事,其实这个问题困扰了 ...

  8. 程序设计与算法----递归之放苹果问题

    问题描述 例题:放苹果 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问公有多少种不同的分法?5,1,1和1,5,1是同一种分法 输入 第一行是测试数据数目t(0<=t<=2 ...

  9. 华为机试_HJ61 放苹果【简单】【收藏】

    目录 描述 输入描述: 输出描述: 解题过程 提交代码 递归方法 动态规划方法 学习代码 递归方法 动态规划方法 收藏点 描述 把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种 ...

最新文章

  1. 研究生被录取后放导师鸽子,学校要上报教育部失信名单取消其推免资格
  2. vue入门教程(二)
  3. tree的使用,显示行号,find命令应用
  4. 老万的java技术书单:你还在吃快餐吗?
  5. 使用MongoDB进行事件流
  6. linux 拨号网关,用LINUX做在一张软盘上的拨号网关 (转)
  7. 成年人不懂这些道理,会吃很多亏
  8. Java 14 发布了,不使用class也能定义类了?还顺手要干掉Lombok!
  9. 离散效率写给自己的话 二
  10. NSIS例子-TSE3.6.2脚本
  11. 利用THINKPHP框架开发的自定义表单及数据字典模板
  12. 尼康d850相机参数测试软件,尼康D850 这可能是你唯一需要的单反相机
  13. 多媒体制作技术心得体会_多媒体演示文稿设计与制作学习心得
  14. (八十一)探索hidl-gen使用及IWifi.hal 实现
  15. html图片隐藏文字,怎样用CSS隐藏图片背景的文字内容
  16. people are able to buy the same products anywhere in the world
  17. Exchange邮箱的创建和配置
  18. 有关网络通信的基本概念
  19. 主数据管理平台功能模型介绍
  20. linux压缩文件命令_24.gzip、unzip命令详解 - 钟桂耀

热门文章

  1. TiKV 在京东云对象存储元数据管理的实践
  2. 系统稳定型建设之单元测试Spock落地
  3. 概率论与数理统计——随机事件及其概率
  4. php商城如何解决订单高并发,php商城高并发下订单模拟
  5. 使用selenium模拟登陆新浪微博
  6. 淘宝-静态页面编写(2)--给淘宝写个头吧
  7. 嵌入式项目实战——基于QT的视频监控系统设计(一)
  8. 淘宝核心系统团队博客
  9. 网站SEO优化 站内优化和站外优化的具体内容和区别
  10. 解决git push时报“remote: You are not allowed to upload code“的报错