import java.util.Arrays;
/**
* 行李分两袋,使得重量之差最小
* @author lgqin
*
*/
public class TravelMinWeight {
public static int[][] knapsack(int[] w, int[] v, int c) {
int i, j, n = w.length;
int[][] m = new int[n + 1][c + 1];
for (j = 0; j < c + 1; j++)
m[0][j] = 0;
for (i = 1; i < n+1 ; i++) {
m[i][0] = 0;
for (j = 1; j < c+1; j++) {
if (w[i-1] <= j) {
m[i][j] = Math.max(m[i - 1][j], m[i - 1][j - w[i-1]] + v[i-1]);
} else {
m[i][j] = m[i - 1][j];
}
}
}
return m;
}
public static int[] buildSolution(int[][] m, int[] w, int weight) {
int n = w.length;
int[] x = new int[n];
int j = weight;
for (int i = n; i > 0; i--) {
if (m[i][j] == m[i - 1][j]) {
x[i-1] = 0;
} else {
x[i-1] = 1;
j = j - w[i-1];
}
}
return x;
}
public static void main(String[] args) {
int []w= {1,3,5};
int []w1= {2,4,7,9};
int[][] m;// m用于存放最优值,m[i][j],其中j表示背包中已有物体总的重量,i表示第i个物体
int[] x ;// x中存放的是背包中放入的物体
int total=0;
for(int i=0;i<w1.length;i++)
total+=w1[i];
int weight=total/2;
m = knapsack(w1, w1, weight);
x = buildSolution(m, w1, weight);
System.out.println(Arrays.toString(x));
for (int i = 0; i < w1.length; i++) {
System.out.println(Arrays.toString(m[i]));
}
}
}
旅游物品分两份,使得两份重量差值最小,代码实现
最新推荐文章于 2022-04-30 20:38:13 发布