#include<iostream>
#include<queue>
using namespace std;
#define NUM 100
struct Node
{
int weight; //重量
int value; //价值
int level; //层次
int flag; //1是左孩子,0是右孩子
friend bool operator< (Node a, Node b)
{
return a.value < b.value;
}
};
priority_queue<Node> priq;
//增加结点
void enQueue(int weight,int value,int level,int flag,int n,int* best)
{
Node node;
node.weight = weight;
node.value = value;
node.level = level;
node.flag = flag;
if (level == n)
{
if (value > *best) *best = value;
return;
}
else priq.push(node);
return;
}
//分支限界算法的实现
//w为重量数组,v为价值数组,c为背包容量,n为物品个数,best为全局最大价值
int knapsack(int w[],int v[],int c,int n,int* best)
{
Node live;
live.weight = 0;
live.value = 0;
live.level = 0;
live.flag = 0;
priq.push(live);
do
{
if (live.weight+w[live.level]<=c)
{
enQueue(live.weight + w[live.level], live.value + v[live.level],
live.level + 1, 1, n, best);
}
enQueue(live.weight, live.value, live.level + 1, 0, n, best);
live = priq.top();
priq.pop();
}
while (!priq.empty());
return 0;
}
int main()
{
int w[NUM];
int v[NUM];
int c;
int n;
while(scanf("%d%d",&c, &n)!=EOF)
{
for(int i=0; i<n; i++)
scanf("%d%d",&w[i],&v[i]);
int best=0;
knapsack(w,v,c,n,&best);
printf("%d\n", best);
}
return 0;
}
分支限界算法求解0-1背包问题:不构造最优解,使用struct和优先队列priority_queue
最新推荐文章于 2021-09-08 17:00:49 发布