解決問題的方法巧妙性在於對問題本質的深入理解
問題
劍指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 協議》,轉載必須註明作者和本文連結