装载问题之分支限界法

    有一批共n个集装箱要装上2艘重量分别为c1和c2的轮船,其中集装箱i的重量为wi,满足w1+w2+…+wn<c1+c2。
    基本思路:尽可能将第一艘船装满,如果剩余的货物和小于等于第二艘船的容积,则可以放下,否则无法放下。
    目标:对第一艘船装载时的优化问题。


参考代码如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct QNode{
    int data;
    struct QNode *next;
}QNode, *QueuePtr;

typedef struct{
    QueuePtr front;
    QueuePtr rear;
}Queue;

int initQueue(Queue &Q)
{
    Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode));
    if(!Q.front)
        return -1;
    Q.front->next=NULL;

    return 1;
}

int emptyQueue(Queue Q)
{
    if (Q.front==Q.rear)
        return 1;
    else
        return 0;
}

int destroyQueue(Queue &Q)
{
    while(Q.front){
        Q.rear=Q.front->next;
        free(Q.front);
        Q.front=Q.rear;
    }
    return 1;
}

int enQueue(Queue &Q, int ele)
{
    QueuePtr p=(QueuePtr)malloc(sizeof(QNode));
    if(!p)
        return -1;
    p->data=ele; p->next=NULL;
    Q.rear->next=p;
    Q.rear=p;
    
    return 1;
}

int deQueue(Queue &Q, int &ele)
{
    QueuePtr p;
    if(Q.front==Q.rear)
        return -1;
    p=Q.front->next;
    ele=p->data;
    Q.front->next=p->next;

    if(Q.rear==p) Q.rear=Q.front;
    
    free(p);

    return 1;
}

Queue loadingQueue;
int bestw, n;

void inQueue(int wt, int i)
{
    if(i==n-1)
    {
        if(wt>bestw)
            bestw=wt;
    }
    else
        enQueue(loadingQueue,wt);
}



int main()
{
    
    int i,j,k;
    int *w, ew;
    int c;

    printf("input the number of things and the volume of ships:");
    scanf("%d%d",&n,&c);

    w=new int[n];
    printf("input the weights:");
    
    for(i=0;i<n;i++)
        scanf("%d",&w[i]);
    
    initQueue(loadingQueue);
    enQueue(loadingQueue,-1);

    i=0;	//层数
    ew=0;	//扩展结点对应的载重量

    while(true)
    {
        if(ew+w[i]<=c)
            inQueue(ew+w[i],i);
        inQueue(ew,i);

        deQueue(loadingQueue, ew);

        if(ew==-1) //同层结点尾部
        {
            if(emptyQueue(loadingQueue))
            {
                printf("the result is %d.\n",bestw);
            }

            enQueue(loadingQueue,-1);
            deQueue(loadingQueue, ew);
            i++;
        }
    }		
    
    return 0;
}


    原文作者:分支限界法
    原文地址: https://blog.csdn.net/softwareldu/article/details/41170137
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞