1 递归

public class Solution {
    public int cutRope(int target) {
        if(target < 4)
            return target-1;
        return getMax(target);
    }
    public int getMax(int target){
        if(target < 4)
            return target;
        int n1 = 2 * (target-2);
        int n2 = 3 * (target-3);
        return n2 > n1 ? n2 : n1;
    }
}

通过递归可以很容易看出,最后的结果就是x个3和y个2相乘。
那x和y怎么确定呢,3越多越大还是2越多越大,还是说3和2的搭配有种奇妙的关系呢?

结论如下:

当 n>5 时,我们尽可能多地剪长度为 3 的绳子;当剩下的绳子长度为 4 时,把绳子剪成两段长度为 2 的绳子。

因此就有了第二种解法。

2 贪婪

public int cutRope(int target) {
        if(target < 4)
            return target-1;
        int timesOf3 = target/3;
        if(target - 3*timesOf3 == 1)
            timesOf3 -= 1;
        int timesOf2 = (target - 3*timesOf3)/2;
        return (int)Math.pow(3,timesOf3)*(int)Math.pow(2,timesOf2);
    }