剪绳子(一个整数划分)问题的解决思路

题目描述:

      有一根长度为n的绳子, 现要将绳子剪成整数长的m段(m,n都是整数, n>1并且m>1), 每段绳子的长度记为k[0], k[1], ...,k[m]. 问k[0]*k[1]*...*k[m]可能的最大乘积是多少?例如, 当绳子的长度是8时, 把它剪成长度分别为2,3, 3的三段, 此时得到的最大乘积是18.

分析思路:

    1. 确定k[i]的范围。

     假如k[i]=1, 此时k[0]*k[1]*...*k[i]*k[m]=k[0]*k[1]*...*k[m] 显然要小于 k[0]*k[1]*...*(k[i]+k[m])=k[0]*k[1]*...*k[m]+k[0]*k[1]*...*k[i], 即k[0], k[1],...,k[i],k[m]的乘积小于k[0], k[1],...,(k[i]+k[m])的乘积, 所以k[i]不应取1,应尽量取大于1的数, 但是若n=2, 要满足m>1,此时只能剪成1,1的两段;若n=3, 则只能剪成1, 2的两段。

      假如k[i]>=5, 如k[i]=5, 此时k[0]*k[1]*...*k[i]*k[m]=k[0]*k[1]*...*5*k[m]显然要小于k[0]*k[1]*...*(2+3)*k[m]=k[0]*k[1]*....*6*k[m], 通过不等式x^2+x>2x+1知对与任意的x>5, 总是可以将x至少分成两个数x1, x2使 x1*x2>x.

     当k[i]=4, 此时将k[i]分成2, 2则最终的结果相等。

     综上述, k[i]的取值只能在{1, 2, 3}中选取出来。

   2. 问题解决方法:

     定义线段n的剪切方法为split(n), 于是原问题可以通过比较max(2, split(n-2))和max(3, split(n-3))得到。

posted on 2019-12-22 19:55  da_yong  阅读(383)  评论(0编辑  收藏  举报

导航