演算法題 剪繩子(貪心演算法)

2021-10-03 01:39:46 字數 1162 閱讀 7157

題目描述

給你一根長度為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,意義見題面。(2 <= n <= 60)

輸出描述:

輸出答案。

示例1

輸入

8
輸出

18
貪心演算法:

貪心演算法的基本思路是從問題的某乙個初始解出發一步一步地進行,根據某個優化測度,每一步都要確保能獲得區域性最優解。每一步只考慮乙個資料,他的選取應該滿足區域性優化的條件。若下乙個資料和部分最優解連在一起不再是可行解時,就不把該資料新增到部分解中,直到把所有資料列舉完,或者不能再新增演算法停止。

解題:

題意:一段長度大於2的繩子,分成不能少於2段的繩子,求分後的繩子乘積最大值。

按照貪心演算法,每次按照區域性最大求解。

length=2, max=1*1=1

length=3, max=1*2=2

比4小的數差分下來做乘積都比原來的數小。

拆分4是個臨界值:4=2*2。

length=4, max=2*2=4

拆分5時,5=4)

int a = length % 3;//求出拆分3之後剩下的餘數

int b = length / 3;//求出有多少個3

if (a == 0)//剛好拆分3拆分完

return (int) (math.pow(3, b));

else if (a == 1)//餘數為1,說明把4拆分了;所以把3的個數減1

return (int) (math.pow(3, b - 1) * 4);

else //(a==2)

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

}}

剪繩子(動態規劃 貪心演算法)

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

剪繩子 演算法 從剪繩子看動態規劃和貪心演算法

給你一根長度為 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。普通的動...

剪繩子 貪心演算法 劍指offer

題目分析 先舉幾個例子,可以看出規律來。2 1 1 3 1 2 4 2 2 5 2 3 6 3 3 7 2 2 3 或者4 3 8 2 3 3 9 3 3 3 10 2 2 3 3 或者4 3 3 11 2 3 3 3 12 3 3 3 3 13 2 2 3 3 3 或者4 3 3 3 下面是分析 ...