剪绳子问题原理(动态规划与贪婪算法)

       原题是剑指offer面试题14的剪绳子问题,涉及到动态规划和贪婪算法。原问题侧重于动态规划和贪婪算法的原理及实现,对问题本身的分析不到位,尤其是为什么当 n>5时,只要证明3(n-3)>2(n-2)就可以证明应该将绳子切割出尽量多的长度为3的绳子。本文用数学公式的形式推导此问题最优解为何每一小段绳子长度为3时绳子的乘积最大。

问题描述:一段绳子的长度为n,划分为m段(n,m均为整数,n>1且m>1),每段的长度记为k[0],k[1],k[2],…,k[m],请问k[0]×k[1] ×k[2] ×…×k[m]可能的最大乘积时多少?

问题分析:原理上类似于将周长相等的绳子围成m边形,求m边形面积最大。尽量将绳子切为等长得到的乘积才能最大,因此原问题可以描述为如下的数学公式:

我们的目标时求出每一小段绳子长为k时使得最后的乘积最大,n为已知的绳子长度,mod为不够k长度剩余的一小段绳子长度,范围为 0<mod<k也可视作常数,因此可以用变量k代替变量m求解最大乘积,变为一个求单变量k的最优解问题,数学描述如下:

为求解方便,将公式(2)变为一般形式的数学公式,描述如下:

公式(3)的形式求导比较困难,研究公式(3)的变化趋势,可以对方程两边取对数成为新的函数,然后对新函数求导,因为对数函数为增函数,所以新函数的变化趋势与原函数相同,公式(3)求对数后如下:

绳子总长度b为5以下时较为简单单独讨论,此处讨论的是b大于等于5的情况。用复合函数求导将公式(4)求导可得:

函数(4)的驻点为 ,即函数(4)的最大值应该为2.7,但由于x只能取正整数值,所以讨论x的取值为2还是3时最大:

所以 的峰值在x=3处,则 的峰值也在x=3处。

具体的代码实现在网上可以随便找到,此处不附录了,主要时说明一下剪绳子问题为什么每一小段绳子长度是3时最后的乘积最大的数学原理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值