首页 > 编程知识 正文

动态规划问题应用(盘里有5个苹果,5个人分,还要剩一个)

时间:2023-05-06 21:19:38 阅读:73692 作者:4040

主题:有m个苹果,n个盘子。 每个盘子里可以放无数苹果。 有多种分类方法? 例如,如果有5个苹果、5个盘子,则分为(11111 )、(1112 )、(113 )、(14 )、(212 )、(23 )、(5)共7种分类方法。

分析:

这个问题有两种解法。 一种是回溯法,设定列表[ 1,2,…m],组合列表内的要素。 组合条件有两个,1 ),它们之和为m。 2 )、它们的个数不能超过n。 如果满足该条件,则停止回溯并记录结果。 最后看看这样的组合有几个就行了。

另一种是动态规划法。 这是我在这篇文章里写的解法。

m和n容易混淆哪个是苹果,哪个是盘子,所以这里用苹果表示,盘子用plates表示。 假设f(apples,plates )函数表示有apples个苹果、plates个盘子时的划分方法。

1,http://www.Sina.com /,那就是不管有几个盘子,都是一个盘子装苹果,其他盘子是空的;

2,http://www.Sina.com /,那也只有一种把所有苹果放在这个盘子里的划分方法;

因此,我们必须

ifapples=1or plates==1:3358 www.Sina.com /

3,http://www.Sina.com /,盘子比苹果还多,所以撤多余的盘子不影响结果

因此,我们必须

ifplatesapples:http://www.Sina.com /

4,http://www.Sina.com/b,空盘子,即至少有一个盘子里没有苹果。

f(apples,plates(_a表示a的情况下的分法,f ) apples,plates ) _b表示b的情况下的分法,当apples只有1个或者0个时

如果没有空盘子,你可以在每个盘子里放一个苹果,把剩下的苹果分成这些盘子。 即,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 ) appples

那么F(Apples,plates-1 )怎么计算? 那么,返回步骤4的开始位置,根据步骤4的逻辑,返回f(f(f(apples,plates-1 )=f (apples,plates-1 ) _af ) apples,plates-1 )

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,

查看f(apples,plates ) _b和f(apples,plates-1 ) _b的结果,可以看到f ) apples,plates-2 ) f(apples,plates-3 ) ) ) f )

因此,根据以上内容,在plates=apples情况下,

f(apples,plates(=f ) apples-plates,plates ) ) f(appels,plates-1 ) )。

用代码如下实现上述4种情况(导入词典备忘录,提高执行速度) )。

devide _ dict={ } def devide _ apple (apples,plates ) : ifapples=1or plates==1: return1ifplatesaples 3360 plates plates plates (in devide _ dict : return devide _ dict [ (apples,plates ) ]else:count=devide_apple ) apples-pples

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。