第1关:装载问题(hncj算法)

文章详细描述了如何使用优先队列法和分支限界算法解决装载问题,涉及MaxHeap数据结构的使用,以及活节点管理和子集空间树的搜索过程,最终找到最优装载重量和方案。
摘要由CSDN通过智能技术生成

for(int j=2; j<=n; j++)

{

r += w[j];

}

QNode *E = 0, //当前扩展节点

*bestE; //当前最优扩展节点

//搜索子集空间树

while(true)

{

//检查左儿子节点

Type wt = Ew + w[i];

if(wt <= c)//可行节点

{

if(wt>bestw)

{

bestw = wt;

}

EnQueue(Q,wt,i,n,bestw,E,bestE,bestx,true);

}

//检查右儿子节点

if(Ew+r>bestw)

{

EnQueue(Q,Ew,i,n,bestw,E,bestE,bestx,false);

}

Q.Delete(E);//取下一扩展节点

if(!E)//同层节点尾部

{

if(Q.IsEmpty())

{

break;

}

Q.Add(0); //同层节点尾部标识

Q.Delete(E); //取下一扩展节点

i++; //进入下一层

r-=w[i]; //剩余集装箱重量

}

Ew =E->weight; //新扩展节点所对应的载重量

}

//构造当前最优解

for(int j=n-1; j>0; j–)

{

bestx[j] = bestE->LChild;

bestE = bestE->parent;

}

return bestw;

}

第2关:装载问题 (最优队列法)

MaxHeap.h

#include

using namespace std;

template

class MaxHeap

{

public:

MaxHeap(int MaxHeapSize = 10);

~MaxHeap() {delete [] heap;}

int Size() const {return CurrentSize;}

T Max()

{ //查

if (CurrentSize == 0)

{

cout<<“out of bound”<<endl;

}

return heap[1];

}

MaxHeap& Insert(const T& x); //增

MaxHeap& DeleteMax(T& x); //删

void Initialize(T a[], int size, int ArraySize);

private:

int CurrentSize, MaxSize;

T *heap; // element array

};

template

MaxHeap::MaxHeap(int MaxHeapSize)

{// Max heap constructor.

MaxSize = MaxHeapSize;

heap = new T[MaxSize+1];

CurrentSize = 0;

}

template

MaxHeap& MaxHeap::Insert(const T& x)

{// Insert x into the max heap.

if (CurrentSize == MaxSize)

{

cout<<“no space!”<<endl;

return *this;

}

// 寻找新元素x的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值