1.装载问题
1.算法设计: 一个maxloading函数用于初始化成员变量,并调用backtrack回溯算法,接着backtrack回溯算法对子树进行搜索;测试类进行数据调试。
2.代码实现:
public class Loading {
static int n; //集装箱数
static int []w; //集装箱重量数组
static int c1; //第一艘船重量
static int c2; //第二艘船重量
static int cw; //当前载重量
static int bestw; //当前最优载重量
static int r; //剩余集装箱重量
static int []x; //当前解
static int []bestx; //当前最优解
public static int maxloading(int []ww,int cc,int []xx) {
n=ww.length-1;
w=ww;
c1=cc;
cw=0;
bestw=0;
x=new int[n+1];
bestx=xx;
for(int i=1;i<=n;i++)
r+=w[i];
backtrack(1);
return bestw;
}
private static void backtrack(int i) {
//搜索第i层节点
if(i>n) {
//到达叶节点
if(cw>bestw) {
for(int j=1;j<=n;j++)
bestx[j]=x[j];
bestw=cw;
}
return ;
}
//搜索子树
r-=w[i];
if(cw+w[i]<=c1) {
//搜索左子树
x[i]=1;
cw+=w[i];
backtrack(i+1);
cw-=w[i];
}
if(cw+r>bestw) {
x[i]=0; //搜索右子树
backtrack(i+1);