1. 程式人生 > 其它 >泡泡的課堂小練習之剪繩子

泡泡的課堂小練習之剪繩子

技術標籤:習題演算法

剪繩子

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

假定繩子長度大於4,那麼可以得到一個表

繩子長度最大乘積時繩子段長
52,3
63,3
72,2,3
82,3,3
93,3,3
102,2,3,3

由表格可以看出,要想得到最大乘積,就要將繩子竟可能的分成2,3長度的小段(4就等於2*2)

那麼就可以用遞迴的方法來求出最大乘積

int cutRope(int);
void SumX(int ,int);
//全域性變數
int max1=0;
//核心部分
void SumX(int long1,int sum)
{
    if(long1 == 0)
    {
        max1=sum>max1?sum:max1;
        //當繩子長為0時,表示已經分段完畢
        //用其最大乘積與當前最大值進行比較
        //如果大於最大值,則替換。反之則不變
        return;
    }
    else if(long1 < 0)
    {
    	//當繩長小於0時,表示結果不合理,直接返回
return; } else { //將繩子分別分成一段為2/3,對應乘積*2/*3 然後遞迴繼續分 //直到繩子長度=0或者<0達到退出條件 SumX(long1-2,sum*2); SumX(long1-3,sum*3); } } int cutRope(int number) { max1=0;//初始化,防止上次輸入結果的干擾 SumX(number,1);//引數1表示繩子長,引數2表示最大乘積(初始化為1) return max1; } int main(
){ //測試一條繩子長度為20的最大乘積 cout << cutRope(20) << endl; return 0; }

在這裡插入圖片描述