网易2017春招笔试真题编程题集合(11)——堆砖块

小易有n块砖块,每一块砖块有一个高度。小易希望利用这些砖块堆砌两座相同高度的塔。为了让问题简单,砖块堆砌就是简单的高度相加,某一块砖只能使用在一座塔中一次。小易现在让能够堆砌出来的两座塔的高度尽量高,小易能否完成呢。 

输入描述:
输入包括两行:
第一行为整数n(1 ≤ n ≤ 50),即一共有n块砖块
第二行为n个整数,表示每一块砖块的高度height[i] (1 ≤ height[i] ≤ 500000)
输出描述:
如果小易能堆砌出两座高度相同的塔,输出最高能拼凑的高度,如果不能则输出-1.
保证答案不大于500000。
输入例子:
3
2 3 5
输出例子:
5

参考:http://blog.csdn.net/zhufenghao/article/details/69802667

使用动态规划

import java.util.*;
public class Main{
    public static void main(String args[]){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int n=sc.nextInt();
            int bricks[]=new int [n];
            int sum=0;
            for(int i=0;i<n;i++){
                bricks[i]=sc.nextInt();
                sum=sum+bricks[i];
            }
            int[][] h=new int[n+1][sum+1];
            tower(bricks,h,n,sum);
            System.out.println(h[n][0]>0?h[n][0]:-1);
        }
        sc.close(); 
    }
    public static void tower(int[] bricks,int[][] h,int n,int sum){
        h[0][0]=0;
        for(int i=1;i<=sum;i++){
            h[0][i]=Integer.MIN_VALUE;
        }
        for(int i=1;i<=n;i++){
            int b=bricks[i-1];
            for(int j=0;i<=sum;j++){
                h[i][j]=h[i-1][j];
                if(j+b<=sum){
                    h[i][j]=Math.max(h[i][j], h[i-1][j+b]+b);
                }
                if(b-j>0){
                    h[i][j]=Math.max(h[i][j],h[i-1][b-j]+b-j);
                }else{
                    h[i][j]=Math.max(h[i][j],h[i-1][j-b]);
                }
            }
        }
    }
}

但提交运行:存在数组越界等非法访问情况???

原文地址:https://www.cnblogs.com/dengyt/p/6962795.html