这道题可以用两个方法解决:
1、动态规划
分析:当绳子长度为n时,将它剪成若干段后各长度乘积有一个最大值f(n),假设剪下第一刀,则绳子分为长度为i和长度为n-i的两段,所以f(n)=max(f(i)*f(n-i)),易知这是一个从上至下的递归公式,
但是递归从上至下计算繁琐,而我们很容易得出f(0)、f(1)、f(2)、f(3)的值,所以我们可以采取从下至上的方式:

int cutRope(int number) {
        if(number<2)
            return 0;
        if(number==2)
            return 1;
        if(number==3)
            return 2;
         
        int *products=new int[number+1];         //存储子问题最优解
        products[0]=0;
        products[1]=1;
        products[2]=2;
        products[3]=3;
        int max=0;
        for(int i=4;i<=number;++i)
        {anzhaoruxiacelue
            max=0;
            for(int j=1;j<=i/2;++j)
            {
                int product=products[j]*products[i-j];
                if(max<product)
                    max=product;
                products[i]=max;
            }
        }
          max=products[number];
          delete []products;
          return max;
    }
2、贪婪算法
按照如下策略剪绳子,则得到的各段绳子的长度的乘积将最大;当n>=5时,我们尽可能多的剪长度为3的绳子;当剩下的绳子长度为4时,把绳子剪成两段长度为2 的绳子:
至于为什么是3就要用数学方法去证明了,有兴趣可以搜索相关资料证明。
int cutRope(int number) {
        if(number==0)
            return 0;
        if(number==2)
            return 1;
        if(number==3)
            return 3;
        int max=0;
        int timesOf3=number/3;
        if(number-timesOf3*3==1)
        {
            timesOf3-=1;
            max=(int)(pow(3,timesOf3))*4;
        }
        else if(number-timesOf3*3==2)
            max=(int)(pow(3,timesOf3))*2;
        else max=(int)(pow(3,timesOf3));
        return max;
    }