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

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

#include 
#include
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->upup;
    }
};
priority_queue,cmp>itemQueue;

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

    int vSum=0;
    for(int i=t; ibestcp)
        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; tbestcp)
            {
                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<<"第"<level<<"个物品 ";
        }

        node=node->parentNode;
    }
}


int main()
{
    itemNode *resNode=NULL;
    cout<<"背包问题"<>wAll;
    cout<<"请输入物品个数:"<>nItem;
    int W[nItem];
    int V[nItem];
    cout<<"请输入物品价值和质量:"<>V[i]>>W[i];
    }
    resNode=branch_bounding(nItem,W,V,wAll);
    cout<<"为使得背包中物品价值最大,选择如下序列:"<

你可能感兴趣的:(算法)