/*
题目:
给定一个长度为n的绳子,把绳子剪为m段,(n>1,m>1)
求各段绳子乘积的最大值。
*/
/*
思路:
贪婪算法。
当绳子的长度大于5时,尽可能多的剪长度为3的绳子;当剩下的绳子长度为4时,把绳子剪为两段长度为2的绳子。
*/
/*
证明:
当n>=5时,2(n-2)>n,3(n-3)>n,也就是当n大于5时,就把它剪为长度为3或2的绳子,且3(n-3)>2(n-2),所以尽可能的剪为长度为3的绳子。
当n=4时,剪为2*2最大。
*/
#include<iostream>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
int cutRope(int number){
if(number <= 1){
throw("invalid parameter");
}
if(number == 2 || number == 3){
return number-1;
}
int timesOf3 = number / 3;
//当剩余长度为4时,剪为2*2
if(number - timesOf3 * 3 == 1){
timesOf3 --;
}
int timesOf2 = (number - timesOf3 * 3) / 2;
return (int)(pow(3,timesOf3))*(int)(pow(2,timesOf2));
}
int main(){
cout<<cutRope(8)<<endl;
}