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

 

你可能感兴趣的:(10-9 JAVA笔试:整数拆分求最大乘积问题)