弄了两个星期,终于把这个问题给解决了,解放了。不过感觉自己的代码太乱了,还有好多地方要改进,比如封装行不强,怎么改写成类的形式还有待完善,不过现在将就着吧,挺有成就感的了。代码如下:
#include<iostream> using namespace std; /****************************************************************************/ struct bbnode { bbnode *parent; bool LChild; }; struct HeapNode { bbnode *ptr; int uweight; int level; }; /****************************************************************************/ /****************************************************************************/ typedef HeapNode ElemType; #define MaxData 32767 typedef struct Heap { int capacity; int size; HeapNode *Elem; }Heap,*HeapQueue; HeapQueue init(int maxElem) { HeapQueue H=new Heap; H->capacity=maxElem; H->size=0; H->Elem=new HeapNode[maxElem+1]; H->Elem[0].uweight=MaxData; return H; } void InsertMax(ElemType x,HeapQueue H) { int i; for(i=++H->size;H->Elem[i/2].uweight<x.uweight;i/=2) H->Elem[i]=H->Elem[i/2];//此时i还没有进行i/2操作 H->Elem[i]=x; } ElemType DeleteMax(HeapQueue H) { int i,child; ElemType MaxElem,LastElem; //存储最大元素和最后一个元素。 MaxElem=H->Elem[1]; //堆是从第1号元素开始的。 LastElem=H->Elem[ H->size– ]; //这里自动让size减少了。 for(i = 1 ; i * 2 <= H->size ; i = child) { child=i * 2; /*在节点有左右子树的时候,可能存在一个大一个小的情况,这时候我们就要找出最小的; 如果Child = H->Size则表明他没有右子树,这时候就没有必要比较了。 */ if(child != H->size && H->Elem[child+1].uweight>H->Elem[child].uweight) child++;//找最大的子树 if(LastElem.uweight < H->Elem[child].uweight) H->Elem[i]=H->Elem[child]; } H->Elem[i]=LastElem; return MaxElem; } /****************************************************************************/ /****************************************************************************/ void AddLiveNode(HeapQueue &H,bbnode *E,int wt,bool ch,int lev) { bbnode *b=new bbnode; b->parent=E; b->LChild=ch; HeapNode N; N.uweight=wt; N.level=lev; N.ptr=b; InsertMax(N,H); } int MaxLoading(int w[],int c,int n,int bestx[]) { //定义最大堆容量为100 HeapQueue H=init(100); //定义剩余重量数组r int *r=new int[n+1]; r[n]=0; for(int j=n-1;j>0;j–) r[j]=r[j+1]+w[j+1]; //初始化 int i = 1; bbnode *E=0; int Ew=0; while(i!=n+1) { int wt=Ew+w[i]; if(wt<=c) AddLiveNode(H,E,wt+r[i],true,i+1); AddLiveNode(H,E,Ew+r[i],false,i+1); HeapNode N; N=DeleteMax(H); i=N.level; E=N.ptr; Ew=N.uweight-r[i-1]; } for(int j=n;j>0;j–) { bestx[j]=E->LChild; E=E->parent; } return Ew; } /****************************************************************************/ int main() { int n=3; int c=60; int w[]={-1,10,40,50}; int bestx[100]; int bestw=MaxLoading(w,c,n,bestx); cout<<bestw<<endl; for(int j=1;j<=n;j++) //输出最优解结构 cout<<bestx[j]<<” “; cout<<endl; return 1; }