子数组的和的差值最小

这个问题是泛微面经的评论里一个老哥碰到的,对于我这种算法彩笔来说还是写写记下来的好。

题目

数组中的数分为两组,给出一个算法,使得两个组的和的差的绝对值最小。数组中的数的取值范围是0 比如a[]={2,4,5,6,7},得出的两组数{2,4,,6}和{5,7},abs(sum(a1)-sum(a2))=0;
比如{2,5,6,10},abs(sum(2,10)-sum(5,6))=1,所以得出的两组数分别为{2,10}和{5,,6}。

链接:https://www.nowcoder.com/questionTerminal/1fb223d0e46e481baec6897f5955c45a
来源:牛客网

	public static int KnapSack(int num, int weight[], int value[], int x[], int C){
        int V[][] = new int[C+1][C+1];
        for(int i = 0 ; i <= num ; i++ ){
            V[i][0] = 0; //第一列都为0;
        }
        for(int j = 0 ; j <=C ; j++){
            V[0][j]=0;    //第一行都为0
        }
        for(int i = 1 ; i <= num-1 ; i++){
            for(int j = 1 ; j <=C ; j++){
                //想要向包中添加第i个物品,若物品体积大于当前体积,是无论如何都加不进去的
                if(j0; i--){
            if(V[i][j]>V[i-1][j]){
                x[i]=1;
                j=j-weight[i];
            }
            else
                x[i]=0;
        }
        System.out.println("选中的物品是:");
        for(int i = 1 ; i < num ; i++){
            System.out.print(x[i]+" ");            
        }
        return V[num-1][C];        
    }

你可能感兴趣的:(数据结构和算法——Java实现)