6.2 装载问题
算法6.3(1) 装载问题回溯算法的数据结构
算法6.3(3) 剩余集装箱的重量r初始化
6.3 0-1背包问题
算法6.4(1) 0-1背包问题回溯算法的数据结构
算法6.4(1) 0-1背包问题回溯算法的数据结构
算法6.4(2) 0-1背包问题回溯算法的实现
//形参i是回溯的深度,从0开始
void backtrack(int i)
{
//到达叶子结点时,更新最优值
if (i+1>n) {bestv = cv; return;}
//进入左子树搜索
if (cw+Q[i].w<=c)
{
cw += Q[i].w;
cv += Q[i].v;
backtrack(i+1);
cw -= Q[i].w;
cv -= Q[i].v;
}
//进入右子树搜索
if (Bound(i+1)>bestv) backtrack(i+1);
}
算法6.4(3) 限界函数Bound()的实现
//形参i是回溯的深度
int Bound(int i)
{
int cleft = c-cw; //背包剩余的容量
int b = cv; //上界
//尽量装满背包
while (i<n && Q[i].w<=cleft)
{
cleft -= Q[i].w;
b += Q[i].v;
i++;
}
//剩余的部分空间也装满
if (i<n) b += 1.0*cleft*Q[i].v/Q[i].w;
return b;
}