0-1背包问题(队列)
#include<iostream>
#define N 3 //物品种类
#define W 5 //背包重量
using namespace std;
int w[N]={1,2,3}; //物品重量
int v[N]={6,12,10}; //物品价值
int maxV=0; //最大价值
int sum=28; //物品总价值"界"
int sumV[N]={28,18,6};
int front=-1,rear=-1;
struct node{
int n; //队列编号
int w; //当前重量
int v; //当前价值
int parent; //父节点
int ub; //当前界
}qu[2*N-1];
void bfs(){
struct node root={0,0,0,-1,sum};
qu[rear+1]=root;
rear++;//根节点进队
while(front!=rear){//队列不为空
int u=front+1;
front++;//根节点出队
if(qu[u].ub>maxV){ //界
if(qu[u].w+w[qu[u].n]<=W){//可以装下,生成新节点
struct node Lchild={qu[u].n+1,qu[u].w+w[qu[u].n],qu[u].v+v[qu[u].n],u,qu[u].ub};
qu[rear+1]=Lchild;
rear++;//新节点进队
if(maxV<qu[rear].v)
maxV=qu[rear].v;
}
if(qu[u].v+sumV[qu[u].n]>maxV){//剪枝
struct node Rchild={qu[u].n+1,qu[u].w,qu[u].v,u,qu[u].ub-v[qu[u].n]};
qu[rear+1]=Rchild;
rear++;//新节点进队
if(maxV<qu[rear].v)
maxV=qu[rear].v;
}
}
}
}
int main(){
bfs();
cout<<maxV<<endl;
}
0-1背包问题(优先队列)
#include<iostream>
#include<queue>
#define N 3 //物品种类
#define W 5 //背包重量
using namespace std;
int w[N]={1,2,3}; //物品重量
int v[N]={6,12,10}; //物品价值
int maxV=0; //最大价值
int sum=28; //物品总价值"界"
int sumV[N]={28,18,6};
struct node{
int n;
int w;
int v;
int ub;
friend bool operator<(node a,node b){
return a.ub < b.ub; //结构体中,x大的优先级高 ,先出队
// return a.ub > b.ub; //结构体中,x小的优先级高 ,先出队
}
};
priority_queue<node> q;//优先队列
void bfs(){
struct node root={0,0,0,sum};
q.push(root);//进队
while(!q.empty()){
struct node u=q.top();//取队头元素
q.pop();//根节点出队
if(u.ub>maxV){
if(u.w+w[u.n]<=W){
struct node l={u.n+1,u.w+w[u.n],u.v+ v[u.n],u.ub};
q.push(l);//新节点进队
if(maxV<u.v)
maxV=u.v;
}
if(u.v+sumV[u.n]>maxV){
struct node r={u.n+1,u.w,u.v,u.ub-v[u.n]};
q.push(r);//新节点进队
if(maxV<u.v)
maxV=u.v;
}
}
}
}
int main(){
bfs();
cout<<maxV<<endl;
}