剪繩子問題

2021-10-04 01:23:19 字數 1593 閱讀 7375

給你一根長度為 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。

首先是貪婪演算法:貪婪演算法可以是找到乙個數學情景,可以證明在這種場景下,達到最優解。在剪繩子的過程中,盡量剪長度為3的繩子,如果剩下的繩子是4,可以不用剪。由於5< 23,可以看出,當n>=5, 3(n-3)> n ,

2*(n-2)>n,並且3*(n-3)> 2*(n-2) 可以看出,n>5的時候,盡量剪成2和3的,並且,剪成3的長度優於2。4 =2 *2所以,剪成4和2一樣。

class

solution

(object):

defcuttingrope

(self, n)

: a =

0if n ==2:

return

1if n ==3:

return

2if n ==4:

return

4while n >=5:

n = n -

3 a +=

1if n ==1:

return

pow(

3, a)

if n ==2:

return2*

pow(

3, a)

if n ==3:

return3*

pow(

3, a)

if n ==4:

return4*

pow(

3, a)

2.動態規劃

採用自底向上的思想,相當於一根繩子肯定會剪成兩根,然後剩下的兩根繩子再依次去剪。如果從1開始依次計算出每種長度的繩子的最優解,那麼,新的繩子的長度的計算就可以依賴於之前的繩子,只需要拆成兩種長度的相乘即可,因為之前的繩子已經是最優解了。

注意是一定要剪一刀,所以1,2,3,4情況特殊,列出來,與後面如果剪到1,2,3,4的時候不一樣,剪下去不是最優解。

class

solution

(object):

defcuttingrope

(self, n)

:if n ==1:

return

false

if n ==2:

return

1if n ==3:

return

2if n ==4:

return

4 a =

0)1)

2)3)

4)for i in

range(5

, n+1)

:max=0

for j in

range(1

, i//2+

1):if a[j]

*a[i-j]

>

max:

max= a[j]

*a[i-j]

max)

return a[n]

剪繩子 演算法 C 學習之路之剪繩子問題

基於c 實現剪繩子問題,既將一根長度為n的繩子,剪成m段,使m段的乘積最大。如,長度為10的繩子,最大乘積為36。使用動態規劃和貪心演算法實現,具體 如下 include stdio.h include stdlib.h include using namespace std 動態規劃問題 剪繩子問...

劍指Offer 剪繩子 和剪繩子

劍指offer 剪繩子 題目描述 給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 請問 k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的...

剪繩子 演算法 424,劍指 Offer 剪繩子

給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 1 請問 k 0 k 1 k m 1 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。示例 1 ...