这个问题是泛微面经的评论里一个老哥碰到的,对于我这种算法彩笔来说还是写写记下来的好。
题目
数组中的数分为两组,给出一个算法,使得两个组的和的差的绝对值最小。数组中的数的取值范围是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];
}