**
- 描述:
- 有一组物品,其重量分别是:
- w1,w2…wn
- 现在有两艘轮船,其容量分别是C1和C2,
- 满足w1+w2+…+wn <= C1 + C2
- 问怎么装载物品,才能够把物品全部装上轮船
**
代码实现:
public class shiploading {
static int[] w = {12,18,21,14,9,10};
static int c1 = 55;
static int c2 = 30;
static int[] x = new int[w.length];
static int[] bestx = new int[w.length];
static int bestw = Integer.MIN_VALUE;
static int cw = 0;
static int r = 0; // 记录物品i后面所有物品的总重量
public static void main(String[] args) {
for (int i = 0; i < w.length; i++) {
r += w[i];
}
backstrace(0);
int sum = 0;
for (int i = 0; i < bestx.length; i++) {
if(bestx[i] == 0){
sum += w[i];
}
}
if(sum > c2){
System.out.println("物品无法装载到轮船!");
return;
}
System.out.println("C1:" + c1 + "装载物品:");
for (int i = 0; i < bestx.length; i++) {
if(bestx[i] == 1){
System.out.print(w[i] + " ");
}
}
System.out.println();
System.out.println("C2:" + c2 + "装载物品:");
for (int i = 0; i < bestx.length; i++) {
if(bestx[i] == 0){
System.out.print(w[i] + " ");
}
}
System.out.println();
}
private static void backstrace(int i) {
if(i == w.length){
if(cw > bestw){
bestw = cw;
for (int j = 0; j < x.length; j++) {
bestx[j] = x[j];
}
}
} else {
r -= w[i];
if(cw + w[i] <= c1){
cw += w[i];
x[i] = 1;
backstrace(i+1); // 选择第i个节点
cw -= w[i];
}
if(cw + r > bestw){
x[i] = 0; // 才有必要去往右边的i节点
backstrace(i+1); // 没选择第i个节点
}
r += w[i];
}
}
}