0-1背包问题(分支限界-优先队列)

//Author: FF-W
//Date: 29, Oct, 2018
//Purpose: 0-1背包问题(分支限界-优先队列)

#include <iostream>
#include<queue>
using namespace std;

class itemNode
{
public:

    int cw;
    int cp;
    bool isleft;
    int level;
    int up;
    itemNode* parentNode;
    itemNode(int w,int p,bool is_left,int lev,int upp,itemNode*node)
    {
        cw=w;
        cp=p;
        isleft=is_left;
        level=lev;
        up=upp;
        parentNode=node;
    }
    itemNode()
    {

    }

    /*itemNode(itemNode* node)
    {
        cw=node->cw;
        cp=node->cp;
        isleft=node->isleft;
        level=node->level;
       // parentNode=node->parentNode;
    }*/

    itemNode& operator=(const itemNode& node)
    {
        cp=node.cp;
        cw=node.cw;
        isleft=node.isleft;
        up=node.up;
        level=node.level;
        parentNode=node.parentNode;
        return *this;

    }

    itemNode* clone()
    {
        return this;
    }

};
struct cmp{
    bool operator ()(itemNode*a,itemNode* b)
    {
        return a->up<b->up;
    }
};
priority_queue<itemNode*,vector<itemNode*>,cmp>itemQueue;

bool check(int t,int cp,int V[],int nItem,int bestcp)
{

    int vSum=0;
    for(int i=t; i<nItem; i++)
    {
        vSum+=V[i];
    }
    if(vSum+cp>bestcp)
        return true;
    return false;
}

itemNode* branch_bounding(int nItem,int W[],int V[],int wAll)
{
    int i=0;
    int cp=0;
    int cw=0;
    int bestcp=0;
    itemNode *node=NULL;
    itemNode *retNode=NULL;

    while(true)
    {

        if(i+1>nItem&&node->cp>bestcp)
        {
            retNode=node->clone();
            return retNode;
        }

        else
        {
            int rp=0;
            for(int t=i; t<nItem; t++)
            {
                rp+=V[t];
            }
            if(cw+W[i]<=wAll)
            {
                itemQueue.push(new itemNode(cw+W[i],cp+V[i],true,i+1,cp+rp,node));
            }
            if(rp+cp>bestcp)
            {
                itemQueue.push(new itemNode(cw,cp,false,i+1,cp+rp,node));

            }
        }

        if (itemQueue.empty())
        {
            break;
        }
        node=itemQueue.top();
        itemQueue.pop();
        i=node->level;
        cw=node->cw;
        cp=node->cp;
    }
    return retNode;
}

void show(itemNode*node)
{
    while(node!=NULL)
    {
        if(node->isleft!=0)
        {
            cout<<"第"<<node->level<<"个物品 ";
        }

        node=node->parentNode;
    }
}


int main()
{
    itemNode *resNode=NULL;
    cout<<"背包问题"<<endl;
    cout<<"请输入背包总容量:"<<endl;
    int wAll;
    cin>>wAll;
    cout<<"请输入物品个数:"<<endl;
    int nItem;
    cin>>nItem;
    int W[nItem];
    int V[nItem];
    cout<<"请输入物品价值和质量:"<<endl;

    for(int i=0; i<nItem; i++)
    {
        cin>>V[i]>>W[i];
    }
    resNode=branch_bounding(nItem,W,V,wAll);
    cout<<"为使得背包中物品价值最大,选择如下序列:"<<endl;
    show(resNode);

    return 0;
}


版权声明:本文为qq_39191000原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。