该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include "preConst.h"
#include
#include
#include"sqlist.h" Status InitList_Sq(SqList &L)
{
L.elem=(HeapType*)malloc(sizeof(ElemType)*LIST_INIT_SIZE);
if (!L.elem)exit(OVERFLOW);
L.listsize=LIST_INIT_SIZE;
return OK;
}
Status Insert(SqList &L,HeapType e)
{
//SqList L;
HeapType *newbase,*q,*p;
if(L.length>=L.listsize){
newbase=(HeapType*)realloc(L.elem,
(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)
exit(OVERFLOW);
L.elem=newbase;
L.listsize+=LISTINCREMENT;
}
q=&(L.elem[L.length]);
for(p=&(L.elem[L.length]);p>=q;--p)*(p+1)=*p;
*q=e;
++L.length;
return OK;
}//ListInsert-Sq
Status DeleteMax(SqList &L,HeapType &N)
{
//SqList L;
HeapType *q,*p;
p=&(N);
q=L.elem+L.length-1;
for(++p;p<=q;++p)*(p-1)=*p;
--L.length;
return OK;
};//ListDelete-Sq
int Bound(int i,Knap &K)
{
int cleft=K.c-K.cw;
int b=K.cp;
while(i<=K.n&&K.w[i]<=cleft)
{
cleft-=K.w[i];
b+=K.p[i];
i++;
}
if(i<=K.n)
b+=K.p[i]/K.w[i]*cleft;
return b;
} void AddLiveNode(int up,int cp,int cw,int ch,int lev,Knap &K,SqList &L,HeapType &N)
{
bbnode *b=new bbnode;
b->parent=K.E;
b->Lchild=ch;
//HeapType N;
N.uprofit =up;
N.profit=cp;
N.weight=cw;
N.level=lev;
N.ptr=b;
for(int i=L.length/2;i>0;--i)
HeapAdjust(L,i,L.length);
Insert(L,N);
for(i=L.length/2;i>0;--i)
HeapAdjust(L,i,L.length+1);
} int MaxKnapsack(Knap &K,SqList &L,HeapType &N)
{
K.bestx=new int[K.n+1];
int i=1;
K.E=0;
K.cw=K.cp=0;
K.bestp=0;
int up=Bound(1,K); while(i!=K.n+1)
{
int wt=K.cw+K.w[i];
if(wt<=K.c)
{
if(K.cp+K.p[i]>K.bestp)
K.bestp=K.cp+K.p[i];
AddLiveNode(up,K.cp+K.p[i],K.cw+K.w[i],true,i+1,K,L,N);
};
up=Bound(i+1,K);
if(up>=K.bestp)
AddLiveNode(up,K.cp,K.cw,false,i+1,K,L,N);
DeleteMax(L,N);
HeapSort(L);
K.E=N.ptr;
K.cw=N.weight;
K.cp=N.profit;
up=N.uprofit;
i=N.level;
} for(int j=K.n;j>0;j--)
{
K.bestx[j]=K.E->Lchild;
K.E=K.E->parent;
}
return K.cp;
} int Knapsack(int p[],int w[],int c,int n,Knap &K,SqList &L)//
{
HeapType N;
int i,j;
int W=0;
int P=0;
Object *Q=new Object[n];
for(i=1;i<=n;i++)
{
Q[i-1].ID=i;
Q[i-1].d=1.0*p[i]/w[i];
P+=p[i];
W+=w[i];
}
if(W<=K.c)
return P;
float f;
for(i=0;i
for(j=i;j
if(Q[i].d
{
f=Q[i].d;
Q[i].d=Q[j].d;
Q[j].d=f;
}
K.p=new int[n+1];
K.w=new int[n+1];
for(i=1;i<=n;i++)
{
K.p[i]=p[Q[i-1].ID];
K.w[i]=w[Q[i-1].ID];
}
K.cp=0;
K.cw=0;
K.c=c;
K.n=n;
K.bestp=MaxKnapsack(K,L,N);
for(j=1;j<=n;j++)
K.bestx[Q[j-1].ID]=K.bestx[j];
delete[]Q;
delete[]K.w;
delete[]K.p;
delete[]K.bestx;
return K.bestp;
} void HeapAdjust(SqList &L,int s,int m)
{
HeapType rc=L.elem[s];
for(int j=2*s;j<=m;j*=2)
{
if(j
++j;
if(!LT(rc.uprofit,L.elem[j].uprofit))
break;
L.ele***.elem[j];
s=j;
}
L.elem[s]=rc;
}
void HeapSort(SqList &L)
{
HeapType t;
for(int i=L.length/2;i>0;--i)
HeapAdjust(L,i,L.length);
for(i=L.length;i>1;--i)
{
t=L.elem[1];
L.elem[1]=L.elem[i];
L.elem[i]=t;
HeapAdjust(L,1,i-1);
}
}//HeapSort
void main()
{
SqList L;
InitList_Sq(L);
L.length =6;
Knap K;
int i;
int n=5,c=10,sum=0;
int p[5+1]={0,6,3,5,4,6};
int w[5+1]={0,2,2,6,5,4}; K.bestx=new int[10];
for(i=1;i<=n;i++)
K.bestx[i]=0;
sum=Knapsack(p,w,c,n,K,L);
printf("%d",sum);
printf("\n");
for(i=1;i<=n;i++)
printf("%d ",K.bestx[i]);
printf("\n");
}