题目:有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(ap

本文介绍了如何使用动态规划方法解决有m个苹果和n个盘子的分配问题。当每个盘子可以放置无限个苹果时,讨论了四种不同情况并给出递推公式。通过回溯法和动态规划法对比,详细阐述了动态规划的思路和代码实现,最终通过字典备忘录加速计算过程。
最低0.47元/天 解锁文章
1740

被折叠的 条评论
为什么被折叠?



