剪绳子

解决问题的方法巧妙性在于对问题本质的深入理解

问题

剑指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 协议》,转载必须注明作者和本文链接
pardon110
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

请勿发布不友善或者负能量的内容。与人为善,比聪明更重要!
开发者 @ 社科大
文章
102
粉丝
12
喜欢
82
收藏
38
排名:102
访问:4.6 万
私信
所有博文