【剑指offer系列】-14剪绳子(贪心算法、数学推导)

题目:

给一根长度为n的绳子,请把绳子剪成m段(m,n都是整数且1),每段绳子的长度相乘最大乘积是多少?如绳子长度为8,当分别为2,3,3时,此时最大乘积18

1.思路:贪婪算法,每一步都可以做出一个贪婪的选择,基于此选择,我们能得到最优解
2.贪婪选择:

在这里插入图片描述

  • n%3=0

       12/3=4,则s=3^4=81
    
  • n%3=1

     	13/3=4余1,此时拿出一段3和余下的1,组成4 
     	s=3^(4-1)*(3+1)
    
  • n%3=2

     	13/3=4余2
     	s=3^4*2		
    
3.代码
 		12 =>  (3^4)*(2^0)
 		13 =>  (3^3)*(2^2)  
 		14 =>	(3^4)*(2^1)	

public class Main14 {
    public static void main(String[] args) {
        int len = new Scanner(System.in).nextInt();
        System.out.println(maxMultip(len));
    }
    private static int maxMultip(int len) {
        if (len < 2)
            return -1;
        if (len ==2)
            return 1;
        if (len == 3)
            return 2;
        int timoeOf3 = len / 3;
        if (len - 3* timoeOf3 == 1)
            timoeOf3 -= 1;
        int timeOf2 = (len - 3 * timoeOf3) / 2;
        return (int)Math.pow(3,timoeOf3)*(int)Math.pow(2,timeOf2);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值