贪心和回溯两种方法解决最优装载问题

131 阅读1分钟

贪心算法

  • c:载重量
  • w:货物重量数组(程序开始前将其递增排序)
  • x:路径数组(用来记录最优解)(初始化为0)
void load()
{
    for(int i=1;i<=n && w[i]<=c;i++)
    {
        x[i]=1;
        c-=w[i];
    }
}



回溯算法

  • i:深度
  • r:第一艘船的载重量
  • cw:当前船上集装箱的重量
  • w:集装箱的重量数组
  • x:路径数组,记录最优解
// 搜索第i层节点
void backtrack(int i)
{
    if (i > n)
    {
        更新最优解bestx, bestw;
        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);
    }

    r += w[i]; // 置反
}