//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;
}
0-1背包问题(分支限界-优先队列)
最新推荐文章于 2024-05-23 22:41:21 发布