剪绳子——为什么3的个数越多,乘积越大

1.题目

力扣中有一题是这样描述的:

给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳

子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?

例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

题目链接

2.分析

大家肯定都看到了大佬在题解区的分析,即将绳子分解成3的个数越多时乘积越大,不过那个证明公式还是非常复杂的,在这里我用另外一种方式比较简单的方式进行证明;

任何一个比1大的数都可以由2和3组成,既然任何数都可以分解为2和3,那么将这些2和3乘起来得到的结果要想取得较大,自然而然其中的3要更多。
需要注意的是,将n分解后多个3后最后剩下来的值,如果小于五就不要再分解为3了,因为我们前面的证明是将自然数分解为由2和3构成,当一个数为4时,再将其分解为1和3就打破了2和3组成的证明了;

3.实现代码

int cuttingRope(int n){
    
    
    //分段中3的个数越多,乘积的长度越长
    if(n==2)
    return 1;
    if(n==3)
    return 2;

   int ret=1;
   while(n>=5)
   {
    
    
       ret*=3;
       n-=3;
   }
   return n*ret;
}

猜你喜欢

转载自blog.csdn.net/ych9527/article/details/112525540