给你一根长度为 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。
解题思路:
这里用到了一个数学思路:当n个数相加的和固定时(设目标和为target),要让这n个数的乘积最小,则必须让这n个数尽量接近。如:将9分成3个数的和,当3个数同时为3时,它们的积为27最大,因为此时三个数相等,相互之间最为接近。
但若n个数不能完全一样该怎么办,此时可以先找出n个相同的数让他们的和尽量大但小于target。设这n个数均为a,则可得a=target//n(整除取整数部分);此外设target%n=b(取余数),则b就是n个a相加后与target的差值,因此可以从n个a中选出b个依次增加1,这样就有了b个(a+1)和n-b个a,这样就满足了它们和为target且它们之间尽量靠近。
代码如下:
class Solution:
def cuttingRope(self, n: int) -> int:
self.res=0
for i in range(2,n+1):#将绳子切成i份,每一份的数字尽量接近才能使乘积最小
self.quotient=n//i
self.remainder=n%i
self.tempNum=pow(self.quotient+1,self.remainder)*pow(self.quotient,(i-self.remainder))
self.res=max(self.res,self.tempNum)
return self.res