01背包优先队列优化

0-1背包问题-分支限界法(优先队列分支限界法) 算法的思想 首先,要对输入数据进行预处理,将各物品依其单位重量价值从大到小进行排列。 在优先队列分支限界法中,结点的优先级定义为:以结点的价值上界作为优先级(由bound函数计算出) 步骤 算法首先根据基于可行结点相应的子树最大价值上界优先级,从堆中选择一个节点(根节点)作为当前可扩展结点。 检查当前扩展结点的左儿子结点的可行性。 如果左儿子结点是可行结点,则将它加入到子集树和活结点优先队列中。 当前扩展结点的右儿子结点一定是可行结点,仅当右儿子结点满足上界函数约束时,才将它加入子集树和活结点优先队 阅读详情

01背包优先队列优化

在这里插入图片描述
在这里插入图片描述
设重量为w,权值为v
则单位重量价值为v / w
设有物品1,物品2
若v1 / w1 < v2 / w2
则说明v2的单位重量价值高
即v1 * w2 < v2 * w1
于是可重载结构体,使得v2 * w1大的优先级高
即:

struct Node {
	LL w, v;
	Node() {};
	Node(LL _w, LL _v) {w = _w, v = _v;}
	friend bool operator < (Node a, Node b) {
		return a.v * b.w < b.v * a.w;
	}
};

重点是本题数据范围
1 <= w <= 100
1 <= v <= 1e9
可见价值与质量相比
价值占主导地位
接着按照贪心的思想
单位重量价值越高的越先装入背包
本题结束

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>

using namespace std;

typedef long long LL;

struct Node {
	LL w, v;
	Node() {};
	Node(LL _w, LL _v) {w = _w, v = _v;}
	friend bool operator < (Node a, Node b) {
		return a.v * b.w < b.v * a.w;
	}
};

LL dp[105];

int main()
{
	LL n, m, w, v;
	while(scanf("%lld%lld", &n, &m) != EOF) {
		priority_queue<Node> q;
		for(int i = 0; i < n; i ++) {
			scanf("%lld%lld", &w, &v);
			q.push(Node(w, v));
		}
		LL ans = 0;
		while(m > 100) {
			ans += q.top().v;
			m -= q.top().w;
			q.pop();
		}
		memset(dp, 0, sizeof(dp));
		while(!q.empty()) {
			w = q.top().w;
			v = q.top().v;
			q.pop();
			for(int i = m; i >= w; i --) {
				dp[i] = max(dp[i], dp[i - w] + v);
			}
		}
		ans += dp[m];
		printf("%lld\n", ans);
	}
	return 0;
}
利用优先队列式分支限界法解决0-1背包问题 问题描述: 给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包最大承载重量为C。物品是不可分割的,应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 要求: 随机生成物品和背包数据,利用分支限界法求解该问题并形成解题报告。 一、问题分析: 0-1背包问题用优先队列式分支限界法实现时, ①问题有2^n种可能解(物品放入/不放入背包); 解空间树为子集树:左子节点(当前物品放入)、右子节点(当前物品不放入) ②约束条件:背包剩余容量 lw ≥ 当前物品重量 w (判断能否生成左孩子结点) 约 阅读详情

相关推荐

多重背包的优化(二进制优化/单调队列优化)

多重背包 定义:有一个固定容量的背包,并且有若干种物品,每种物品有nin_ini​个,每种物品所占的空间是viv_ivi​,价值为wiw_iwi​,问如何取可以让背包内的物品的总价值最大。 朴素的多重背包dp f[i][j]f[i][j]f[i][j]的定义:表示从前iii种物品中选,背包容量为jjj的情况下,所有选法的最大值。 f[i][j]=max(f[i][j],f[i−1][j−k∗v[i]]+k∗w[i]);f[i][j]=max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);

weixin_51712179的博客 1117

优先队列式分支限界法解01背包

概念: 分支限界采用的是广搜。 优先队列采用的是队列里最优的出队。(这里采用最大堆来实现活结点优先队列,最大堆以活结点的界值作为优先级) 说明: 对于优先队列式分支限界法解01背包,实际上是广搜遍历生成树的过程。因为01背包。背包只有选和不选。所以该生成树是一个二叉树。假设规定左叉标1(代表选择该物品装入背包),右叉标0(代表不选择该物品装入背包)。给定示例输入: 背包容...

远行的博客 2万+

游戏安全逆向实战:如何用010Editor绕过ACE反作弊的文件校验(附详细步骤)

本文详细介绍了如何通过逆向工程思维和010Editor工具,针对PC游戏中ACE反作弊系统的文件校验机制进行分析与绕过。文章以实战案例为核心,逐步拆解了定位校验逻辑、解析校验数据文件、计算并替换哈希值的关键步骤,为安全研究人员提供了一种在用户态(Ring 3)层面进行轻量化对抗的思路与方法。

iii12的专栏 724

分支限界法解决01背包问题

1. 问题描述 设有n个物体和一个背包,物体i的重量为wi价值为pi ,背包的载荷为M, 若将物体i(1<= i <=n)装入背包,则有价值为pi . 目标是找到一个方案, 使得能放入背包的物体总价值最高. 设N=3, W=(16,15,15), P=(45,25,25), C=30(背包容量) 2. 队列式分支限界法 可以通过画分支限界法状态空间树的搜索图来理解...

weixin_30682127的博客 4695

用Multisim仿真石英晶体振荡电路:从等效模型到频响曲线实战

本文通过Multisim软件,从构建石英晶体等效电路模型入手,详细演示了如何仿真分析其电抗频率特性曲线,并实战搭建与调试皮尔斯振荡电路。文章深入探讨了振荡必须工作在串联与并联谐振点之间感性区的原因,为电子设计者提供了从理论到仿真的完整可视化学习路径。

ik67890123的博客 500

ε-差分隐私之拉普拉斯噪声机制(定义 + 证明 + 代码)

ε-差分隐私之拉普拉斯噪声机制 差分隐私的描述 1-范式的定义:使用matlab调用函数norm(x, 1) 更多范式见 范式 差分隐私的定义应该满足 拉普拉斯噪声的证明全过程如下: DP方向差分隐私证明是基本入门!!! -拉普拉斯噪声分布代码 Laplace分布的概率密度函数的形式是: 使用python - matplotlib来绘制概率分布图: import matplotlib.pyplot as plt import numpy as np def laplace_fun

毕业才是起点 1万+

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

先看一段代码 queue<int>q; q.push(5); q.push(2); q.push(3); int* p= &q.front(); q.pop(); cout << *p; 输出是5. 元素5在pop()后仍存在于内存中,仅仅是出队了而已. ...

IronBull_Zhang的博客 1924

解决MATLAB2020B关于找不到vs2019C++编译器问题

解决MATLAB2020B关于找不到vs2019C++编译器问题

wcm2577的博客 7605

【HDU 3810】 Magina (01背包,优先队列优化,并查集)

Magina Problem Description Magina, also known as Anti-Mage, is a very cool hero in DotA (Defense of the Ancient).If you have no idea of him, here is some brief introduction of his legendary...

weixin_30849591的博客 289

9、储备池学习:从学习到学习的新范式

本文探讨了基于学习到学习(L2L)框架的储备池计算新范式,提出通过在外循环中优化储备池的超参数(如递归连接权重、输入权重和读出初始化),以提升其在多种任务中的内循环学习性能。研究展示了两种主要实验设置:一是优化储备池用于回归二阶Volterra滤波器任务,显著优于随机基线;二是实现无需调整读出权重、仅依赖内部动态学习非线性函数的能力,表明储备池可快速构建目标函数的内部模型并安装任务先验知识。结合流程图与表格,文章系统呈现了L2L的训练流程、技术细节及实验结果,并讨论了性能提升、泛化能力等开放问题,指出了未来

ujm56789012的博客 502

openclaw通俗入门系列6——记忆系统

记忆 = 智能体的笔记本,分长期(MEMORY.md)和每日(memory/日期.md)。只有写到文件里的才能记住!支持语义搜索(理解意思)+ 关键词搜索,还能自动在压缩前保存重要内容。

m0_60605453的博客 403

多重背包及其二进制/优先队列优化

多重背包 定义:有一个固定容量的背包,并且有若干种物品,每种物品有 n i n_i ni​个,每种物品所占的空间是 v i v_i vi​,价值为 w i w_i wi​,问如何取可以让背包内的物品的总价值最大。 朴素的多重背包dp f [ i ] [ j ] f[i][j] f[i][j]的定义:表示从前 i i i种物品中选,背包容量为 j j j的情况下,所有选法的最大值。 f [ i ] [ j ] = m a x ( f [ i ] [ j ] , f [ i − 1 ] [ j − k × v

weixin_51712179的博客 427

构建一个基于Simulink的LC滤波器仿真模型

需求分析LC滤波器(Inductor-Capacitor Filter)是一种常见的无源滤波器,广泛应用于电力电子、通信、音频处理等领域。其主要作用是平滑输入信号中的高频谐波成分,保留低频或直流成分,从而提高输出信号的质量。在电力电子系统中,LC滤波器常用于逆变器、整流器等设备的输出端,以减少开关噪声和电磁干扰(EMI),确保输出电压和电流的稳定性。本项目将基于Simulink平台,开发一个完整的LC滤波器仿真模型,涵盖从电源输入到滤波输出的整个过程,并通过PI控制器实现对滤波效果的闭环控制。

MHD0815的博客 740

DP(动态规划)中常见背包问题的总结

关于背包问题比较经典的讲解应该是 dd大牛的背包九讲 学习视频的话推荐大雪菜老师的讲解,大雪雪菜老师讲的详细并且易懂,我就不像在博客中分析思路了。 前6种 后3种 //给出关系图 视频中的题目刷题地址 各类背包问题,大体都是讲,在背包容积一定的情况下,怎样选择物品使价值之和最大。 1. 01背包(每个物品至多选一次) #include<bits/stdc++.h> using name...

qq_42835440的博客 343

Qt入门教程【Core篇】singal and slot信号与槽

Qt中信号与槽singal and slot

小鱼酱的博客 2449

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

背包问题综合

01背包问题:若干个物体,每个价值为c[i]重量为w[i],数量均为1,背包最大容量为W,问怎样取物体才能最大化收益?解法:dp[i][j]以j为容量为放入前i个物品(按i从小到大的顺序)的最大价值。有递推关系式:dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+c[i])。这里的第一维度可以省略。注意这里的内存重量循环j为W到0,递减关系(保证每个物体...

TT4191105的博客 213

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

超大01背包(hdu 5887)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5887 题意:01背包,就是收集草药,每个收集和整理的过程需要时间,整理收集完一个草药会获得一定的分数,要求在限定时间内整理和收集的草药得到的分数最高,就是数据范围有点大,到10的9次方 题解:范围太大,不能用一般的数组存下,10的9次方,内存会爆,可以采用减少内存的办法,即是每次记录可以达到的重量

M_GSir的博客 1568

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

背包模型

01背包:从右往左(因为只能由上一个物品的状态退出,如果从左往右则前边的保存的已是装了这件物品的值)递推,放不放此物品 完全背包:从左往右递推 多重背包:二进制拆包,或用单调队列优化(应该不考吧看的不明白QAQ) 装满背包:只把f[0]设为0 分组背包:把有依赖关系的方程一组,然后在一个阶段了分别dp不取附件,取一个,取两个(只有主次依赖) 二维费用:再加一维费用的循环 ...

weixin_30375247的博客 113

HDU 3810 Magina (优先队列+DFS 实现01背包)

Magina 题目链接:HDU 3810 Magina 某些怪物是联通的,Magina每次只能选择一个堆进行打怪,也就是分组的01背包,最后如果有解的话,肯定是在打某个堆的某些怪物。因为这个题的时间最大为10亿,我们不能开一个10亿大小的数组。所以用优先队列解决01背包问题,同时进行减枝。 怎么用优先队列解决01背包,思想可以看如下链接: 优先队列式分支限界法 AC代码: #include<cstdio> #include<cstring> #include<a.

热爱编程,热爱技术 483

【算法设计与程序分析】0-1背包问题 (DP + 跳跃点 + 空间优化)

#include<iostream> #include<queue> #include<algorithm> #define MAXNUM 30 using namespace std; class Bag{ //在跳跃点解法时使用 public: Bag(){ val = 0; weight = 0; } public: int val; int weight; friend bool operator < (Bag a,Bag

Changqing9的博客 819

【hdu3080】01背包(容量10^7)

【hdu3080】01背包(容量10^7) 【题意】n个物品,有wi和vi,组成若干个联通块,只能选取一个联通块,问得到m的价值时最小要多少空间(v)。n&lt;=50,v&lt;=10^7 【题解】 先用并查集找出各个联通块。 这题主要就是v太大了,跟以往的背包不同。 我们回想01背包,f[j+v[i]]=max(f[j]+w[i]); ...

qq_25768269的博客 178

分支界限——01背包问题

01背包问题 背包问题是著名的NP完全问题,在实际生活中有广泛的应用。01背包是背包问题中的一种,也是较简单的一种,有很多种算法可以求解01背包问题,这里介绍利用分支界限的算法。 问题描述 设有n个物品,他们具有各自的重量w和价值v;给定一个具有一个容量W的背包,求将物品有选择的放入背包中,使得装入的物品的价值之和最大? 01背包:物品是完整个体,只存在放或不放两种状态,不能放入一部分。 分析设计...

Mr.DImple的博客 4979

HDU - 3810 Magina (并查集+优先队列优化背包)

题意: 有n堆野兽,每堆野兽屠杀完完需要花费ti时间,可以增加金钱gi,敌法师有瞬移技能,可以从某堆野兽移到另一堆野兽,题目有给定从哪堆可以移到哪堆。最后问在满足打的金钱多余m的情况下的最少时间。 分析: 如果题目数据范围小点,那么就是一个01背包的板题了,只要在连通块上进行背包就可以了,但是题意M最大是1e9,显然得考虑优化策略,因为自己的知识有限,所以参考的大佬的优化方法,很机智,用优先...

兜率工的博客 528

背包九讲【进阶版】(上)

本文重新梳理了动态规划中的背包问题,包括01背包、完全背包,多重背包、混合背包和二维费用背包以及各自的优化方式。

2402_88147924的博客 1174

HDU 3810 Magina (推荐)搜索+队列模拟背包

转载请注明出处,谢谢 http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents           by---cxlove   好题啊,前面好多是介绍dota里的这个英雄。。。可以忽略,到了最后一段才开始进入正题。 有n个地方有怪物,杀死每一个地方的怪物可以获得金钱gi,但是要花费ti的时间,英雄有个技能是瞬时移动,不需要花费时间,但是前提是两个地方

窝不是爱酱,喵~~~~ 1627
上一篇: Java函数判定大素数
下一篇: 区间dp模板 石子合并
剑气扬名
博客等级 码龄7年 24粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值