最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 正文

0-1背包问题(分支限界法)

来源:动视网 责编:小OO 时间:2025-09-30 00:54:47
文档

0-1背包问题(分支限界法)

#include#include#defineMaxSize100//最多结点数typedefstructQNode{floatweight;floatvalue;intceng;//结点所在树的层数,从1开始structQNode*parent;boolleftChild;}QNode,*qnode;//存放每个结点typedefstruct{qnodeQ[MaxSize];intfront,rear;}SqQueue;//存放结点的队列SqQueuesq;floatbestv=0;//最优
推荐度:
导读#include#include#defineMaxSize100//最多结点数typedefstructQNode{floatweight;floatvalue;intceng;//结点所在树的层数,从1开始structQNode*parent;boolleftChild;}QNode,*qnode;//存放每个结点typedefstruct{qnodeQ[MaxSize];intfront,rear;}SqQueue;//存放结点的队列SqQueuesq;floatbestv=0;//最优
#include

#include

#define MaxSize 100 //最多结点数

typedef struct QNode

{

float weight;

float value;

intceng;//结点所在树的层数,从1开始

struct QNode *parent;

bool leftChild;

}QNode,*qnode; //存放每个结点

typedef struct

{

qnode Q[MaxSize];

int front,rear;

}SqQueue; //存放结点的队列

SqQueue sq;

float bestv=0; //最优解

int n=0; //实际物品数

float w[MaxSize]; //物品的重量

float v[MaxSize];//物品的价值

int bestx[MaxSize]; // 存放最优解

qnode bestE;

void InitQueue(SqQueue &sq ) //队列初始化

{

sq.front=1;

sq.rear=1;

}

bool QueueEmpty(SqQueue sq) //队列是否为空

{

if(sq.front==sq.rear)

return true;

else

return false;

}

void EnQueue(SqQueue &sq,qnode b)//入队

{

if(sq.front==(sq.rear+1)%MaxSize)

{

printf("队列已满!");

return ;

}

sq.Q[sq.rear]=b;

sq.rear=(sq.rear+1)%MaxSize;

}

qnode DeQueue(SqQueue &sq)//出队

{

qnode e;

if(sq.front==sq.rear)

{

printf("队列已空!");

return 0;

}

e=sq.Q[sq.front];

sq.front=(sq.front+1)%MaxSize;

return e;

}

void EnQueue1(float wt,float vt, int i ,QNode *parent, bool leftchild)

{

qnode b;

if (i==n) //可行叶子结点

{

if (vt==bestv)

{

bestE=parent;

bestx[n]=(leftchild)?1:0;

}

return;

}

b=(qnode)malloc(sizeof(QNode)); //非叶子结点

b->weight=wt;

b->value=vt;

b->ceng=i;

b->parent=parent;

b->leftChild=leftchild;

EnQueue(sq,b);

}

void maxLoading(float w[],float v[],int c)

{

float wt=0;

float vt=0;

int i=1; //当前的扩展结点所在的层

float ew=0; //扩展节点所相应的当前载重量

float ev=0; //扩展结点所相应的价值

qnode e=NULL;

qnode t=NULL;

InitQueue(sq);

EnQueue(sq,t); //空标志进队列

while (!QueueEmpty(sq))

{

wt=ew+w[i];

vt=ev+v[i];

if (wt <= c)

{

if(vt>bestv)

bestv=vt;

EnQueue1(wt,vt,i,e,true); // 左儿子结点进队列

}

EnQueue1(ew,ev,i,e,false); //右儿子总是可行;

e=DeQueue(sq); // 取下一扩展结点

if (e == NULL)

{

if (QueueEmpty(sq)) break;

EnQueue(sq,NULL); // 同层结点尾部标志

e=DeQueue(sq); // 取下一扩展结点

i++;

}

ew=e->weight; //更新当前扩展结点的值

ev=e->value;

}

printf("最优取法为:\

");

for( int j=n-1;j>0;j--) //构造最优解

{

bestx[j]=(bestE->leftChild?1:0);

bestE=bestE->parent;

}

for(int k=1;k<=n;k++)

{

if(bestx[k]==1)

printf("\

物品%d:重量:%.1f,价值:%.1f\

输入物品的数量:\

");

scanf("%d

文档

0-1背包问题(分支限界法)

#include#include#defineMaxSize100//最多结点数typedefstructQNode{floatweight;floatvalue;intceng;//结点所在树的层数,从1开始structQNode*parent;boolleftChild;}QNode,*qnode;//存放每个结点typedefstruct{qnodeQ[MaxSize];intfront,rear;}SqQueue;//存放结点的队列SqQueuesq;floatbestv=0;//最优
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top