67、剪绳子 其实就是求3和4的个数

给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

输入描述:

输入一个数n,意义见题面。(2 <= n <= 60)

输出描述:

输出答案。

示例1

输入

8

输出

18
1、很厉害的一种思路

/**
 * 题目分析:
 * 先举几个例子,可以看出规律来。
 * 4 : 2*2
 * 5 : 2*3
 * 6 : 3*3
 * 7 : 2*2*3 或者4*3
 * 8 : 2*3*3
 * 9 : 3*3*3
 * 10:2*2*3*3 或者4*3*3
 * 11:2*3*3*3
 * 12:3*3*3*3
 * 13:2*2*3*3*3 或者4*3*3*3
 *
 * 下面是分析:
 * 首先判断k[0]到k[m]可能有哪些数字,实际上只可能是2或者3。
 * 当然也可能有4,但是4=2*2,我们就简单些不考虑了。
 * 5<2*3,6<3*3,比6更大的数字我们就更不用考虑了,肯定要继续分。
 * 其次看2和3的数量,2的数量肯定小于3个,为什么呢?因为2*2*2<3*3,那么题目就简单了。
 * 直接用n除以3,根据得到的余数判断是一个2还是两个2还是没有2就行了。
 * 由于题目规定m>1,所以2只能是1*1,3只能是2*1,这两个特殊情况直接返回就行了。
 *
 * 乘方运算的复杂度为:O(log n),用动态规划来做会耗时比较多。
 */
int cutRope(int number) {

    if (number == 2) {
        return 1;
    }
    if (number == 3) {
        return 2;
    }
    int x = number % 3, y = number / 3;
    if (x == 0) {
        return pow(3, y);
    }
    else if (x == 1) {
        return 2 * 2 * pow(3, y - 1);
    }
    else 
        return 2 * pow(3, y);

}
1-1、力扣上的一种讲解

执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户

内存消耗:6 MB, 在所有 C++ 提交中击败了100.00%的用户

    int cuttingRope(int n) {

    if(n<2) return 0;
    if(n<4) return n-1;
    int maxNum=1;
    while(n>4){
        maxNum*=3;
        n-=3;
    }
    maxNum*=n;
    return maxNum;
    }
2、一种DP讲解方法
讲解视频:

https://www.bilibili.com/video/BV18E411T7dU?from=search&seid=16580267998265505121

int cutRope(int number) {
        if (number == 2 || number == 3)
            return number - 1;
        vector<int> ans(number + 1,0);
        ans[0] = 1;
        ans[1] = 1;
        for (int i = 2; i <= number; ++i)
        {
            ans[i] = i - 1;//分为2 段 1