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;

这篇博客介绍了如何运用队列和优先队列来解决经典的0-1背包问题。通过示例代码,展示了两种不同的实现方式,一种是普通队列,另一种是优先队列。在每种方法中,博主都详细解释了如何进行节点的生成、剪枝操作以及如何更新最大价值。这些算法有助于在有限的背包容量下,找到能最大化物品价值的组合。
最低0.47元/天 解锁文章
6万+





