回溯法解决装载问题(约束函数优化)
解题思想
遍历各元素,若cw+w[t]<=c(即船可以装下),则进入左子树,w[t]标记为1,再进行递归,若cw+r>bestw(即当前节点的右子树包含最优解的可能),则进入右子树,否则,则不遍历右子树。
完整代码实现如下
public class Loading {
static int n;//货箱数目
static int[] w;//货箱重量数组
static int c;//第一艘船的重量
static int cw;//当前装载的重量
static int bestw;//目前最优装载的重量
static int r;//剩余货箱的重量
static int[] x;//当前解,记录从根至当前结点的路径
static int[] bestx;//记录当前最优解
public static int MaxLoading(int[] ww,int cc) {
//初始化数据成员,数组下标从1开始
n = ww.length - 1;
w = ww;
c = cc;
cw = 0;
bestw = 0;
x = new int[n+1];
bestx