剑指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)

 参考:https://www.cnblogs.com/aiguozou/p/11576036.html

posted @ 2020-12-24 19:01  foolangirl  阅读(62)  评论(0编辑  收藏  举报