题目描述
给你一根长度为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。
动态规划:
求一个问题的最优解(通常是求最大值或者最小值),而且该问题能够分解成若干个子问题,并且子问题之间还有重叠的更小的子问题,就可以考虑用动态规划来解决这个问题。
应用动态规划之前要分析能否把大问题分解成小问题,分解后的每个小问题也存在最优解。如果把小问题的最优解组合起来能够得到这个问题的最优解,那么我们可以应用动态规划解决这个问题。
class Solution {
public:
int cutRope(int number) {
//申请一个空间,用来装从0~number长度的绳子的分解后的最大值
int *product = new int [number+1];
product[0] = 0;
product[1] = 1;
product[2] = 2;
product[3] = 3;
for(int i = 0;i <= number;i ++)
{
int max = 0;
int temp = 0;
//找出每个长度的最大值
for(int j = 1;j <=i/2;j ++)
{
temp = product[j]*product[i-j];
if(max < temp)
{
max = temp;
}
}
product[i] = max;
}
max = product[number];
delete[] product;
return 0;
}
};
贪婪算法
先放这里,贪婪算法不太懂
贪婪算法和动态规划不一样。当我们应用贪婪算法解决问题的时候,每一步都可以做出一个贪婪的选择,基于这个选择,我们确定能够得到最优解。
int maxProductAfterCutting(int length)
{
if(length < 2)
{
return 0;
}
if(length ==2)
return 1;
if(length ==3)
return 2;
int num3 = length/3;
if(1==length-3*num)
{
num = num-1;
}
int num2 = (length-num3*3)/2;
int sum = 0;
sum = pow(3,num3)*pow(2,num2);
return sum;
}