動態規劃與貪婪演算法 剪繩子

2021-09-25 16:09:24 字數 1245 閱讀 2800

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

1·動態規劃

因為不知道剪在哪個位置是最優的解法,所以只好把所有的可能性都嘗試一遍,然後得出最優的剪法;

首先宣告函式maxcutting 形參為繩子的長度

繩子長度小於等於三時,做判斷-直接輸出資料

宣告乙個用於存放最大乘積值的陣列

本身長度比乘積大的幾個點 (陣列前三個數)

迴圈且避免發生重複的相乘情況的

讓相乘的第乙個數不大於後面那個數防止發生13 31

將相乘的最大值取出

返回最大值

動態規劃**:

package com.helan.b;

public class cuttingropedy

if(length==2)

if(length==3)

int pnum=new int[length+1];

pnum[0]=0;

pnum[1]=1;

pnum[2]=2;

pnum[3]=3;

for(int i=4;i<=length;i++)

private static int maxcutting(int length)

if (length==2)

if(length==3)

int max=1;

while(length>0)

if (length==4)

}return max;

}}

可以不用迴圈

空間複雜度小一點

private static int maxcutting(int length) 

if (length==2)

if(length==3)

int time3=length/3;

if (length-3*time3==1)

int time2=(length-3*time3)/2;

return (int)math.pow(3,time3)*(int)math.pow(2,time2);

}

劍指offer 剪繩子(動態規劃 貪婪演算法)

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

劍指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的三段,此時得到的最大乘積是18。輸入描述 輸入乙個數n,意義見題...

動態規劃 剪繩子

include include include using namespace std 題目 給你一根長度為n的繩子,請把繩子剪成m段 m和n都是整數,n 1並且m 1 每段繩子的長度記為k 0 k 1 k m 請問k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度為8時,我們把它剪成...