c语言 0-1背包分支限界,大家帮我检查一下0-1背包分支限界法代码,不胜感激!...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#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");

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值