题目:
有一段长度为n的绳子,把它剪成m段,例如n=8,把它剪成长度分别为2,3,3的三段,此时得到的最大乘积为18
暴力方法:动态规划
public int func(int n) {
if (n < 2)
return 0;
if (n == 2)
return 1;
if (n == 3)
return 2;
//ints中存的是:max(i,func(i))
int[] ints = new int[n + 1];
ints[0] = 0;
ints[1] = 1;
ints[2] = 2;
ints[3] = 3;
int max = 0;
for (int i = 4; i <= n; i++) {
for (int j = 1; j <= i / 2; j++) {
int temp = ints[j] * ints[i - j];
if (max < temp) {
max = temp;
}
ints[i] = max;
}
}
max = ints[n];
return max;
}
贪婪算法
public int func2(int n) {
if (n < 2)
return 0;
if (n == 2)
return 1;
if (n == 3)
return 2;
//尽可能多地剪去长度为3的绳子段
int timesOf3 = n / 3;
//当绳子最后剩下的长度为4的时候,不能再剪去长度为3的绳子段,因为 2*2 > 3*1
if ((n - timesOf3 * 3) == 1)
timesOf3 -= 1;
int timeOf2 = (n - timesOf3 * 3) / 2;
return (int) Math.pow(3, timesOf3) * (int) Math.pow(2, timeOf2);
}