剪绳子
解决问题的方法巧妙性在于对问题本质的深入理解
问题
剑指offer有这样一道编程题
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
(2 <= n <= 60)
分析
- 全排列形式,比较取积之大也能得到结果,但计算显然非最优解
- 假定各因数之和确定为n,何种情况下各因子乘积最大?(求幂)
- 进一步简化,任意数可分解为奇偶之和,即2或3
假定 n=6
,分解比较结果
2*2*2 < 3*3
结论:排除特殊情况,3分解优先,2次之
代码
python
实现
def cutRope(number):
maxN=1
if 0<number<4:
return number-1
while number>4:
number -=3
maxN *=3
return number*maxN
小结
实质是与剪无关,反而是求正数最大积
本作品采用《CC 协议》,转载必须注明作者和本文链接