10-9 JAVA笔试:整数拆分求最大乘积问题

假设 n 不小于2且不大于58。

根据罗列的最大值结果,从n=5开始,拆分的结果都有数字3。
之后的数字,例如11,可以先拆出来1个3,然后再看余下的8如何拆分。

问题:为何只能取到58?

解决:int最大值为2 的 31 次方 - 1 = 2147483648 - 1 = 2147483647。

如果n=59,则分成19个3+2,结果为2*3^19=288230376151711740,超界。

换成长整型:

    public static long interBreakProblem(long n) {

        if(n==2 || n==3)
            return n-1;
        if(n==4) return n;
        long result=1;
        while(n>4) {
            result*=3;
            n-=3;
        }

        return result*n;

    }

解题思路:

对n除3取整得a,若余1,则max=4*3^(a-1);若其它,则max=(n-3^a)*3^a。

        

问题:为什么是3的幂次最大,而不是2、4或其它呢?

解决:问学方程的同学,说参考柯西不等式???黑人问号。之前印象中一个:A+B+C=X,取最大Y=A*B*C,当且仅当A=B=C。此题,n=9时,貌似合理。待解。

如果用逐层遍历取每一层的最大值,后输出最终的最大值:

public static int integerBreak(int n) {
        int[] dp = new int[n + 1];
        dp[1] = 1;
        for(int i = 2; i <= n; i ++) {
            for(int j = 1; j < i; j ++) {
                dp[i] = Math.max(dp[i], (Math.max(j,dp[j])) * (Math.max(i - j, dp[i - j])));
            }
        }
        return dp[n];
     }

问题:n最大值为58

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值