







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;
}
本文深入探讨了装载问题和0-1背包问题中的回溯算法,详细解析了算法的数据结构及其实现过程,包括如何通过限界函数进行剪枝优化。
4923

被折叠的 条评论
为什么被折叠?



