题目:有m个苹果,n个盘子,每个盘子都可以放无数个苹果,问有多少种分法?例如有5个苹果,5个盘子,则由(11111),(1112),(113),(14),(212),(23),(5)共7种分法。

分析:
这道题我有两种解法,一种是回溯法,即设定一个列表[1,2,…m],然后对列表内的元素进行组合,组合条件有两个,1),它们的和为m。2),它们的个数不能超过n。当满足这种条件时,停止回溯,并记录结果。最后看这样的组合有多少个就行了。
另外一种是动态规划法,这是我这篇文章要写的解法。
因为m和n比较容易混淆谁是苹果谁是盘子,因此这里用apples代表苹果,用plates代表盘子。设f(apples,plates)函数代表当有apples个苹果,plates个盘子时的分法。

1、当apples只有1个或者0个时,那不管盘子有多少个,那只有1种分法,即只在1个盘子里放苹果,其他盘子都空着;
2、当plates只有1个时,那也只有1种分法,即把所有的苹果都放在这个盘子里;
因此,我们可以得出,
if apples <=1 or plates == 1:
f(apples,plates) = 1

3、当plates > apples时,盘子比苹果还多,那把多余的盘子撤了也不影响结果,
因此,我们可以得出,
if plates > apples:
f(apples,plates) = f(apples,apples)

4、当plates <= apples时,那可以分成两种情况:a,没有空盘子,即每个盘子上都放有苹果;b,有空盘子,即至少有1个盘子里没放苹果。
设f(apples,plates)_a代表a情况下的分法, f(apples,plates)_b代表b情况下的分法,我们可以得出,
f(apples,plates) = f(apples,plates)_a + f(apples,plates)_b
对于没有空盘子的情况,那我们可以给每个盘子上都放1个苹果,然后把剩余的苹果再分到这些盘子里。即f(apples,plates)_a = f(apples-plates,plates)
而对于有空盘子的情况,因为苹果数量不变,而盘子数量会变少,即有1个空盘子,有2个空盘子,有3个空盘子,…有plates-1空盘子,因此我们可以知道:
即f(apples,plates)_b = f(apples,plates-1)+f(apples,plates-2)+f(apples,plates-3)+…+f(apples,1)
那么,f(apples,plates-1)怎么算呢?那么此时我们就又回到了第4步的起始位置,按照第4步的逻辑,再推导一遍可知:f(apples,plates-1) = f(apples,plates-1)_a + f(apples,plates-1)_b
f(apples,plates-1)_a = f(apples-(plates-1),plates-1)
f(apples,plates-1)_b = f(apples,plates-2)+f(apples,plates-3)+f(apples,plates-4)+…+f(apples,1)

观察一下f(apples,plates)_b与f(apples,plates-1)_b的结果可以知道,f(apples,plates-2)+f(apples,plates-3)+f(apples,plates-4)+…+f(apples,1)被算了两遍,因此可以得出一个重要的结论:只有1个空盘子的情况的分法里,已经包含了有2个空盘子、有3个空盘子…有plates-1个空盘子的情况。

因此,综上,可以得出当plates<=apples时,
f(apples,plates) = f(apples-plates,plates) + f(appels,plates-1)

将上述四种情况用代码实现如下(引入了字典备忘录,以加快运行速率):

devide_dict = {}
def devide_apple(apples,plates):if apples <= 1 or plates == 1:return 1if plates > apples:plates = applesreturn devide_apple(apples,plates)if (apples,plates) in devide_dict:return devide_dict[(apples,plates)]else:count = devide_apple(apples-plates,plates)+devide_apple(apples, plates-1)devide_dict[(apples,plates)] = countreturn count

动态规划-分苹果:m个苹果,n个盘子的分法个数相关推荐

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

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

  2. 苹果x用安兔兔测试html5,安兔兔跑分23万,苹果iPhone X怎么样?

    苹果iPhone X,最新款苹果手机,也是当下诸多消费者最关注的智能手机之一.但是,8388元起步的高昂售价,只能让普通消费者望而却步. 如今,苹果iPhone X上市32天,软件适配是否又有新进展? ...

  3. 苹果台式机_苹果自研处理器M1跑分出炉,单核性能全球第一

    上个月,AMD发布了适用于台式机的处理器锐龙9 5950X. 制作工艺是7nm.功耗为105W.它是一款仅适用于台式机的处理器,因为它100多瓦的功耗,不太可能在笔记本上应用.5950X也一度被人们尊 ...

  4. c语言 10分苹果,POJ1664 放苹果 递归 C语言

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

  5. 苹果6可以分屏吗_苹果减肥法可以换成其他水果吗

    苹果减肥法可以换成其他水果吗 苹果减肥的目的是通过吃苹果达到减轻体重的目的,混合吃其它食物就不成其为苹果减肥.苹果减肥的伺时,促进体内有毒物质的排泄,混吃其它食物,苹果减肥的特殊功能将显着降低. 光吃 ...

  6. 什么是苹果cms?苹果cms如何安装及使用?

    苹果cms是什么? 苹果cms分2个版本:"苹果cmsv8"和 "苹果cmsv10"苹果cmsv10是由v8进化而来.苹果cms程序是一套采用PHP+MYSQL ...

  7. M 个同样的苹果放在N 个同样的盘子里,允许有的盘子空着不放的算法

    把 M 个同样的苹果放在N 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K 表示)注意:5,1,1 和1,5,1 是同一种分法 eg:输入7,3 输出 8 思路: 本题我们采用递 ...

  8. IP-guard苹果加密软件苹果系统加密Mac文档加密软件

    IP-guard苹果加密软件|苹果系统加密|Mac文档加密软件 员工出差 也能加密管控 对于需要出差外出的同时,授予有限的离线授权. 允许外出继续使用加密文档,文档仍保持加密状态,只能在被授权的计算机 ...

  9. 中国苹果之都苹果快成熟了

    又是一年成熟季节,中国苹果之都苹果快要成熟了.期待中------.等待中----.--

  10. 到底买苹果XS还是XR_苹果xs和苹果xr内部相爱相杀:队友之间该如何选择?

    今天手机哥看到了下面这个问题: 现在还值得买xs吗?还是买xr? 手机哥建议你选择苹果Xr. 目前性价比最高的苹果手机就是这款了. 目前的价位已经跌破5000,4900左右,而移动优先版的xr价格更是 ...

最新文章

  1. Bloomberg开源面向OCaml的JavaScript后端BuckleScript
  2. 万万没想到,钉钉居然是个AI平台
  3. 创建字符设备的三种方法
  4. 【树】Kth Smallest Element in a BST(递归)
  5. c++ array学习
  6. 简单入门Javascript正则表达式
  7. 【操作系统】常见进程调度算法特点总结比较
  8. java jar 版本号,比较两个jar包的版本号
  9. Vue.js组件的重要选项
  10. PHP的接口(interface)
  11. 21 年前濒临倒闭的苹果是如何做到今天万亿市值的?
  12. matlab电气常用工具箱,matlab电气工具箱实验指导书
  13. angular跳转指定页面_angularjs,前端_怎么设置登录成功后跳转到相应的页面,angularjs,前端 - phpStudy...
  14. Mangos地区代码
  15. theos tweak导入自定义类
  16. 青橙N1云OS系统刷机
  17. 蘑菇街商家登录php源码,蘑菇街
  18. 华为中兴为何对未来信心十足?
  19. 使用Hbuilder封装APP(含配置证书)详细图文教程
  20. Qt中textEdit文本编辑区设置滚动条自动向下滑落

热门文章

  1. web自动化:web控件交互操作/多窗口处理/网页frame
  2. 操作系统虚拟存储管理实验
  3. linux ip添加secondary ip,linux 添加secondary ip
  4. 归档日志路径三个参数DB_RECOVERY_FILE_DEST和LOG_ARCHIVE_DEST和LOG_ARCHIVE_DEST_n
  5. JavaScript获取汉字的区位码
  6. ClickHouse S3 外表调研
  7. hive之内表和外表
  8. 爬虫 登录开心网,登录人人网
  9. 辞职时被领导挽留,要不要留下?
  10. 某宝双十一自动养猫,解放你的双手得喵币