算法分析 | 分支限界法 | (优先队列)01背包问题

本文介绍了如何使用优先队列解决01背包问题,分析了问题、提供了代码实现,并详细说明了代码中可能出现的Bug及其解决方案,最后讨论了算法的优化策略。
摘要由CSDN通过智能技术生成

一.问题分析

利用优先队列,以结点的价值上界作为优先值.这里要用到的头文件:<queue>的容器priority_queue.

它的特点是会在内部按特征值自动排序

当优先队列的数据结构是struct时写法如下

struct PState
{
	....
        //成员函数、构造函数、数据成员部分

	friend bool operator <(const PState& a, const PState& b)
	{
		return a.up < b.up;     //up值从小到大--推算-->优先级从小到大
	}
};

priority_queue <PState> q;

 

二.代码实现

分为三部分:全局变量 & 上界函数 & 遍历函数 & 初始化及调用及打印函数

1.全局变量

#include"allh.h"
//采用优先队列的01背包问题
//Priority_queue是可排序的queue,top()返回最大值元素

//物品结构
vector<int>W2 = { 2,5,4,2 };
vector<int>V2 = { 6,3,5,4 };
int N2 = (int)V2.size();

int bestp2;						//记录最优值
vector<bool>bestx2;		//记录最优解

int Volume2;							//记录购物车总容量
int sumv2, sumw2;			//全部物品总重量和总价值

//性价比结构,用于排序
struct Object
{
	int id;				//表示顺序
	double quo;		//记录性价比
};

2.上界函数Bou

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值