原题是剑指offer面试题14的剪绳子问题,涉及到动态规划和贪婪算法。原问题侧重于动态规划和贪婪算法的原理及实现,对问题本身的分析不到位,尤其是为什么当 时,只要证明 就可以证明应该将绳子切割出尽量多的长度为3的绳子。本文用数学公式的形式推导此问题最优解为何时每一小段绳子长度为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长度剩余的一小段绳子长度,范围为 也可视作常数,因此可以用变量k代替变量求解最大乘积,变为一个求单变量k的最优解问题,数学描述如下:
为求解方便,将公式(2)变为一般形式的数学公式,描述如下:
公式(3)的形式求导比较困难,研究公式(3)的变化趋势,可以对方程两边取对数成为新的函数,然后对新函数求导,因为对数函数为增函数,所以新函数的变化趋势与原函数相同,公式(3)求对数后如下:
绳子总长度b为5以下时较为简单单独讨论,此处讨论的是b大于等于5的情况。用符合函数求导将公式(4)求导可得:
函数(4)的驻点为 ,即函数(4)的最大值应该为2.7,但由于x只能取正整数值,所以讨论x的取值为2还是3时最大:
所以 的峰值在x=3处,则 的峰值也在x=3处。
具体的代码实现在网上可以随便找到,此处不附录了,主要时说明一下剪绳子问题为什么每一小段绳子长度是3时最后的乘积最大的数学原理。
标签:乘积,绳子,问题,算法,贪婪,求导,长度,函数 来源: https://blog.csdn.net/YPSXYY/article/details/118001593
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。