题目描述:
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
- 动态规划法:
class Solution {
public:
int cutRope(int number) {
//动态规划法解决
//特殊情况
if(number < 2)
return 0;
else if (number == 2)
return 1;
else if(number == 3)
return 2;
//
int max = 0;
int* lens = new int[number + 1];
lens[0] = 0;
lens[1] = 1;
lens[2] = 2;
lens[3] = 3;
//数组有了四个元素了,循环从4开始计算出其他长度的绳子的切割方法,
for(int i = 4; i <= number; i++)
{
max = 0;
//逐次比较求出最大值
for(int j = 1; j <= number/2; j++)
{
int len = lens[j] * lens[i-j];
if(len > max)
max = len;
}
//最大值存入数组中去
lens[i] = max;
}
max = lens[number];
delete[] lens;
return max;
}
};
- 贪心算法:
class Solution {
public:
int cutRope(int number) {
if(number < 2)
return 0;
else if(number == 2)
return 1;
else if(number == 3)
return 2;
int num_3 = 0, num_2 = 0;
num_3 = number / 3;
if(number - num_3 * 3 == 1)
num_3-=1;
num_2 = (number - num_3 * 3 ) / 2;
return (int) (pow(3, num_3)) * (int) (pow(2, num_2));
}
};