泡泡的課堂小練習之剪繩子
阿新 • • 發佈:2020-12-30
剪繩子
給你一根長度為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,那麼可以得到一個表
繩子長度 | 最大乘積時繩子段長 |
---|---|
5 | 2,3 |
6 | 3,3 |
7 | 2,2,3 |
8 | 2,3,3 |
9 | 3,3,3 |
10 | 2,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;
}