剪繩子

pardon110發表於2020-07-31

解決問題的方法巧妙性在於對問題本質的深入理解

問題

劍指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 協議》,轉載必須註明作者和本文連結

相關文章