子数组的和的差值最小

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

题目

数组中的数分为两组,给出一个算法,使得两个组的和的差的绝对值最小。数组中的数的取值范围是0<x<100,元素个数也是大于0,小于100
比如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(j<weight[i])   
                    V[i][j]=V[i-1][j];
                else{
                    V[i][j] = Math.max(V[i-1][j], V[i-1][j-weight[i]]+value[i]);
                }
                System.out.print(V[i][j]+"\t");
            }
            System.out.println();
        }
        int j =C;
        for(int i = num-1 ; i>0; 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];        
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值