剑指offer67-剪绳子**
题目描述
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
输入描述: 输入一个数n,意义见题面。(2 <= n <= 60)
返回值描述: 输出答案。
示例
输入 8
返回值 18
知识点回顾
贪心、数组、组合数学
当成数学题来做:
- 由于是乘法,那么除了1以外越多数相乘,得到的结果就越大。
- 因此从2开始考虑。但是都分成2的话必然会有奇数分成包含1的段数,因为1相当于浪费了一个乘数,所以如果最后剩1的时候我们应该将他变为3. 因此得到分成的段数长度为2,3是最好的。
- 又因为 2 * 2 * 2 < 3 * 3 说明3个2都不如2个3 ,因此应该让3 相对来说比2 多。
- 于是让该数对3相除,余数如果为2,则分为 1个2 ,N个3 为最优解,如果余数为1,则应分为2个2 ,N-1 个3 为最优解
代码
# -*- coding:utf-8 -*- class Solution: def cutRope(self, number): # write code here if number == 2: return 1 if number == 3: return 2 flg1,flg2=number%3,number//3 if flg1==1: return 2*2*pow(3,(flg2-1)) elif flg1==2: return 2*pow(3,flg2) else: return pow(3,flg2)