最新文章专题视频专题问答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 08:52:11
文档

用分支限界求解0-1背包问题

实验题目:用分支限界求解0-1背包问题物品个数n=4,背包容量c=7,价值向量p={9,10,7,4},重量向量w={3,5,2,1}请求出最优的解及其目标函数值。#include#include#defineMaxSize100//最多结点数typedefstructQNode{floatweight;floatvalue;intceng;structQNode*parent;boolleftChild;}QNode,*qnode;//存放每个结点typedefstruct{qnodeQ[M
推荐度:
导读实验题目:用分支限界求解0-1背包问题物品个数n=4,背包容量c=7,价值向量p={9,10,7,4},重量向量w={3,5,2,1}请求出最优的解及其目标函数值。#include#include#defineMaxSize100//最多结点数typedefstructQNode{floatweight;floatvalue;intceng;structQNode*parent;boolleftChild;}QNode,*qnode;//存放每个结点typedefstruct{qnodeQ[M
实验题目:用分支限界求解0-1背包问题

物品个数n=4,背包容量c=7,价值向量p={9 ,10,7,4},重量向量w={3,5,2,1}请求出最优的解及其目标函数值。

#include

#include

#define  MaxSize 100       //最多结点数

typedef  struct  QNode

{    

    float  weight;

    float  value;

    int    ceng;

    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("最优取法为:\\n");

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("\\n物品%d:重量:%.1f,价值:%.1f\\n",k,w[k],v[k]);

    }

    printf("\\n");

    printf("最优价值为:%.1f\\n\\n",bestv);

      

}

void main()

{

    int c;

    float ewv[MaxSize];

printf("510专区\\n");

printf("请输入物品的数量:\\n");

    scanf("%d",&n);

    printf("请输入背包容量:\\n");

    scanf("%d",&c);

    printf("\\n请输入物品价值和重量:\\n\\n");

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

    {

        printf("物品%d:",i);

        scanf("%f%f",&ewv[i],&w[i]);

        v[i]=w[i]*ewv[i];

        printf("\\n");

    }

}

实验结果:    

    maxLoading(w, v, c);

文档

用分支限界求解0-1背包问题

实验题目:用分支限界求解0-1背包问题物品个数n=4,背包容量c=7,价值向量p={9,10,7,4},重量向量w={3,5,2,1}请求出最优的解及其目标函数值。#include#include#defineMaxSize100//最多结点数typedefstructQNode{floatweight;floatvalue;intceng;structQNode*parent;boolleftChild;}QNode,*qnode;//存放每个结点typedefstruct{qnodeQ[M
推荐度:
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top