动态规划-分苹果:m个苹果,n个盘子的分法个数
题目:有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个盘子的分法个数相关推荐
- 第T题 详解放苹果(递归) =========== 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 <= t < ...
- 苹果x用安兔兔测试html5,安兔兔跑分23万,苹果iPhone X怎么样?
苹果iPhone X,最新款苹果手机,也是当下诸多消费者最关注的智能手机之一.但是,8388元起步的高昂售价,只能让普通消费者望而却步. 如今,苹果iPhone X上市32天,软件适配是否又有新进展? ...
- 苹果台式机_苹果自研处理器M1跑分出炉,单核性能全球第一
上个月,AMD发布了适用于台式机的处理器锐龙9 5950X. 制作工艺是7nm.功耗为105W.它是一款仅适用于台式机的处理器,因为它100多瓦的功耗,不太可能在笔记本上应用.5950X也一度被人们尊 ...
- c语言 10分苹果,POJ1664 放苹果 递归 C语言
Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t(0 ...
- 苹果6可以分屏吗_苹果减肥法可以换成其他水果吗
苹果减肥法可以换成其他水果吗 苹果减肥的目的是通过吃苹果达到减轻体重的目的,混合吃其它食物就不成其为苹果减肥.苹果减肥的伺时,促进体内有毒物质的排泄,混吃其它食物,苹果减肥的特殊功能将显着降低. 光吃 ...
- 什么是苹果cms?苹果cms如何安装及使用?
苹果cms是什么? 苹果cms分2个版本:"苹果cmsv8"和 "苹果cmsv10"苹果cmsv10是由v8进化而来.苹果cms程序是一套采用PHP+MYSQL ...
- M 个同样的苹果放在N 个同样的盘子里,允许有的盘子空着不放的算法
把 M 个同样的苹果放在N 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K 表示)注意:5,1,1 和1,5,1 是同一种分法 eg:输入7,3 输出 8 思路: 本题我们采用递 ...
- IP-guard苹果加密软件苹果系统加密Mac文档加密软件
IP-guard苹果加密软件|苹果系统加密|Mac文档加密软件 员工出差 也能加密管控 对于需要出差外出的同时,授予有限的离线授权. 允许外出继续使用加密文档,文档仍保持加密状态,只能在被授权的计算机 ...
- 中国苹果之都苹果快成熟了
又是一年成熟季节,中国苹果之都苹果快要成熟了.期待中------.等待中----.--
- 到底买苹果XS还是XR_苹果xs和苹果xr内部相爱相杀:队友之间该如何选择?
今天手机哥看到了下面这个问题: 现在还值得买xs吗?还是买xr? 手机哥建议你选择苹果Xr. 目前性价比最高的苹果手机就是这款了. 目前的价位已经跌破5000,4900左右,而移动优先版的xr价格更是 ...
最新文章
- Bloomberg开源面向OCaml的JavaScript后端BuckleScript
- 万万没想到,钉钉居然是个AI平台
- 创建字符设备的三种方法
- 【树】Kth Smallest Element in a BST(递归)
- c++ array学习
- 简单入门Javascript正则表达式
- 【操作系统】常见进程调度算法特点总结比较
- java jar 版本号,比较两个jar包的版本号
- Vue.js组件的重要选项
- PHP的接口(interface)
- 21 年前濒临倒闭的苹果是如何做到今天万亿市值的?
- matlab电气常用工具箱,matlab电气工具箱实验指导书
- angular跳转指定页面_angularjs,前端_怎么设置登录成功后跳转到相应的页面,angularjs,前端 - phpStudy...
- Mangos地区代码
- theos tweak导入自定义类
- 青橙N1云OS系统刷机
- 蘑菇街商家登录php源码,蘑菇街
- 华为中兴为何对未来信心十足?
- 使用Hbuilder封装APP(含配置证书)详细图文教程
- Qt中textEdit文本编辑区设置滚动条自动向下滑落
热门文章
- web自动化:web控件交互操作/多窗口处理/网页frame
- 操作系统虚拟存储管理实验
- linux ip添加secondary ip,linux 添加secondary ip
- 归档日志路径三个参数DB_RECOVERY_FILE_DEST和LOG_ARCHIVE_DEST和LOG_ARCHIVE_DEST_n
- JavaScript获取汉字的区位码
- ClickHouse S3 外表调研
- hive之内表和外表
- 爬虫 登录开心网,登录人人网
- 辞职时被领导挽留,要不要留下?
- 某宝双十一自动养猫,解放你的双手得喵币