【SOJ】超大背包 (回溯法经典应用)

超大背包问题 超大背包问题: 有重量和价值分别为wi和vi的n个物品,从这些物品中挑选总重量不超过W的物品, 求所有挑选方案中价值总和最大值 限制条件: 1 <= n <= 40 1 <= wi, vi <= 10^15 1 <= W <= 10^15 输入: n = 4; w = {2, 1, 3, 2}; v = {3, 2, 4 , 2}; W = 5; 输出: 7(挑... 阅读详情

超大背包

 

前提:01背包问题是NP难问题,解空间可以用子集树表示。

注意点:

1.剪枝条件。一是如果装入后重量超出背包重量就剪枝。二是如果不装入,剩余背包体积可装入价值的上界加上当前价值cv也达不到当前最优价值bestv也剪枝。

2.要求剩余背包可装入体积的上界,需要排序,然后依次装入物品,直到装不下的时候装入一部分。因此可以一开始就对所有物品按照价值重量比进行排序,这样之后的上界计算依次选择即可。

特别注意:

题目的物品体积和价值可以达到10^9,试想极端情况下80个物品的和是会超出int的,因此必须用long long。调了一晚上bug,必须记住!

#include<iostream>
#include<algorithm>
using namespace std;
long long cw;//当前重量
long long cv;//当前价值
long long bestv;//当前最优价值
int n;//物品数
long long v;//背包总重量 
struct Good{
	long long value;
	long long weight;
	bool operator < (const Good &a) const{
		return double(value)/double(weight)>double(a.value)/double(a.weight);
	}
};
Good good[81];
double Bound(int t)//不选择该物品后,如果当前剩余的所有物品装入(完全背包方式)都无法达到当前的bestv,则剪枝 
{
	long long leftw = v - cw;
	double b = cv;//当前价值 
	while(t<=n && good[t].weight<=leftw){
		leftw = leftw - good[t].weight;
		 b += good[t].value;
		 t++;
	 } 
	 if(t<=n) b+= double(leftw)/double(good[t].weight)*double(good[t].value);//t<=n 说明背包不够了,为了计算上界要装入一部分 
	 return b;
}
void dfs(int t)
{
	if(t>n){
		if(cv>bestv) bestv=cv;
		return;
	}
	if(cw+good[t].weight<=v){//如果装入就超过背包重量了剪枝。可以装入,进入左子树。 
		cw += good[t].weight;
		cv += good[t].value;
		dfs(t+1);
		cv -= good[t].value;
		cw -= good[t].weight; 
	}
	if(Bound(t+1)>double(bestv)) //不装入,进入右子树。这里其实不剪枝也能AC 
		dfs(t+1);
}
int main(void)
{
	while(cin>>n>>v){
		cw=cv=bestv=0;
		for(int i=1;i<=n;i++)
			cin>>good[i].weight>>good[i].value; 
		sort(good+1,good+n+1);//排序后顺序选择 
		dfs(1);
		cout<<bestv<<endl;
	}
	return 0;
 } 

可以同时参考的链接:https://blog.youkuaiyun.com/qq_24489717/article/details/49950027

Arduino IDE 2.x 新版本上手体验:比旧版好在哪里?如何迁移你的老项目? 本文详细对比了Arduino IDE 2.x与旧版的功能差异,包括界面革新、代码编辑体验提升和调试工具改进。提供了从安装设置到项目迁移的完整指南,帮助开发者无缝升级并优化工作流程,特别适合嵌入式开发和SoC项目实操。 阅读详情

相关推荐

【动态规划】背包问题(详细总结,很全)

暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!背包问题是动态规划(Dynamic Planning) 里的非常重要的一部分,关于几种常见的背包,其关系如下:在解决背包问题的时候,我们通常都是按照如下五部来逐步分析,把这五部都搞透了,算是对动规来理解深入了。二维dp数组01背包,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历一维dp数组01背包,只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。求组合数:外层遍历物品,内层遍历背包。

m0_51370744的博客 4万+

【背包问题】大容量背包问题(超大背包)

题目描述 有N件物品和一个容量为W的背包。第i件物品的重量是w[i],价值是c[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。 输入描述 第一行为N(1≤N≤40),W(1≤V≤1015)。 下面N行,第i行描述第i个物品的w[i] (1≤w[i]≤1015) ,c[i] (1≤v[i]≤1015),用一个空格分隔。 输出描述 输出只有一个数,最大总价值。 Input 3 225274242 70498827 830583485 72910089 759360759 8.

Elford的博客 4325

完全背包算法1猴子摘桃及回溯

1:完全背包问题 说明:代码包含完全背包问题的 计算方法和回溯代码。针对的问题如下: 猴子代行镇山之令后愈发聪明能干,经常寻找水果与其小伙伴们分享。一日,猴子又到果林中摘果子,果林中有香蕉、桃子、葡萄、苹果还有西瓜等,一番尽情享受之后,这次它开动脑筋,决定用身上的背袋尽量多带走价值高的一些水果与其小伙伴们分享。假设香蕉、桃子、西瓜、苹果以及葡萄5种水果的重量分别为w1,w2,w3,w4,w5(忽略单位,后同),其对应的价值分别为v1,v2,v3,v4,v5(忽略单位)。猴子A随身所带背包的最大载重量为m。

weixin_45695686的博客 903

保姆级01最大背包问题讲解

保姆级01最大背包问题讲解 学习动态规划,始终绕不开01最大背包问题。相较于求解斐波那契数列,01最大背包问题是更标准的动态规划题目(因为它目标是求最值)。接下来我们一点点剖析01最大背包问题的每个细节,去掉那些人云亦云的部分,重点突出一些容易让人迷惑的地方,力求小白也能看明白。 问题描述 有一个背包,容量 capacity=5,有 3个物品,物品不可分割。每件物品和价值如下,要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。 物品编号 1 2 3 重量 1 3 4 价值 1

包龙星的剑 1386

超大背包问题 (折半枚举)

题意:有重量和价值分别为wi,vi的n个物品。从这些物品中挑选总重量不超过W的物品,求所有挑选方案中价值总和的最大值。 限制条件: 1 1 1 输入: n = 4 w = {2, 1, 3, 2} v = {3, 2, 4, 2} W = 5 输出: 7(挑选0、1、3号物品) 分析: 这个问题是前面介绍过的背包问题,不过这次价值和重量都可以是非常大的数值,

MADE_Y 3379

9大背包问题详解9大背包问题详解

9大背包问题详解

超大背包问题(折半枚举, 双向搜索)

有重量和价值分别为wi, vi (1 这是典型的01背包问题,不过dp求解复杂度为O(nW),这里W太大了,因此无法求解。挑选物品方法共有2^n种,也无法直接枚举。但是拆成两半再枚举的话还是可行的,每部分最多只有20个。假设第一部分某个选取方法对应的重量和价值为w1, v1,那么只要在第二部分中寻找w2+w1 #include #include #include #in

算法码上来 729

背包问题,存在最大价值

可以解决的,包括价值和装的问题,然后可以球出问题的最优解,解决问题

超大背包问题(01背包)

超大背包问题:有n个重量和价值分别为w[i]和v[i]的物品,从这些物品中挑选总重量不超过W的物品,求所有挑选方案中价值总和的最大值。其中,1 ≤ n ≤ 40, 1 ≤ w[i], v[i] ≤ 10^15, 1 ≤ W ≤ 10^15. 这个问题给人的第一感觉就是普通的01背包。不过,看完数据范围会发现,这次价值和重量都可以是非常大的数值,相比之下n比较小。使用DP求解背包为题的复杂度是O(

LYHVOYAGE的专栏 1万+

基于Python适用于YOLO目标检测算法的图片数据增强处理

为了增强模型的鲁棒性以及数据的丰富性,同 时为了防止由于数据过少发生过拟合,本设计对数 据集进行数据增强处理,包括随机亮度调节、随机 对比度调节、随机饱和度调节、加入高斯噪声、水 平翻转、运动模糊和旋转 15°

weixin_67136409的博客 699

WorkBuddy 实战:从聊天窗口到 AI 工作台,打造个人自动化助理

大模型时代,对话式 AI 常被当作高级搜索框,难以沉淀为生产力。其根源在于上下文断裂——每次对话都从零开始。AI Agent 的核心原理是通过状态保持、工具调用与流程复用,将临时交互固化为可重复的协作机制。WorkBuddy 作为个人 AI 工作台,以 Agent + Skill + 工作流架构解决该问题:Skill 封装操作手册,工作区沉淀知识上下文,自定义指令约束输出风格。这种设计让周报生成、会议纪要、文档初稿、专利检索辅助等重复劳动实现流程化自动产出。掌握 WorkBuddy 怎么用,关键在于从自己重

weixin_33834910的博客 329

【SOJ】换零钱(多重背包问题)

换零钱(多重背包问题) 注意方案数类型和最优解类型的边界条件和转移状态方程。 #include<iostream> #include<cstring> using namespace std; const int MOD = 1e9+7; int dp[14][10001];//前i种货币换到j分钱的方案数量 int v[14]={0,1,2,5,10,...

coderwait 265

RDD2022 数据格式转换与清洗

Rdd2022数据集,是关于道路损伤的数据集,与rdd2020相比增加了两万多张图片但是由于格式不能被yolo直接使用且其中有大量的图片没有符合要求的标注,特写此文章记录数据清洗与格式化的过程。

蓝胖子的博客 9946

超大背包问题(折半枚举)

超大背包问题: 有n个重量和价值分别为w[i]和v[i]的物品,从这些物品中挑选总重量不超过W的物品,求所有挑选方案中价值总和的最大值。其中,.          这个问题是背包问题。不过这次价值和重量都可以是非常大的数值,相比之下,比较小。使用DP求解背包问题的复杂度是O(nW),因此不能用来解决这里的问题。此时我们应该利用n比较小的特点来寻找其他办法。       挑选物品的方法...

兜率工的博客 1619

深度学习-算法工程师岗位面试常见问题及解答

一、相关的问题 深度学习优化学习方法(一阶、二阶) 一阶方法:随机梯度下降(SGD)、动量(Momentum)、牛顿动量法(Nesterov动量)、AdaGrad(自适应梯度)、RMSProp(均方差传播)、Adam、Nadam。 二阶方法:牛顿法、拟牛顿法、共轭梯度法(CG)、BFGS、L-BFGS。 自适应优化算法有哪些?(Adagrad(累积梯度平方)、RMSProp(累积梯度平方的滑动平均)、Adam(带动量的RMSProp,即同时使用梯度的一、二阶矩))。 梯度下降陷入局部最优有什么解决

nobles007820的博客 2924

ABAP Cloud 里的高性能日志:CL_BALI_LOG、XCO_CP_BAL 与 AML 的性能对比与选型指南

ABAP日志框架性能对比与选型建议 本文对比了ABAP Cloud中三种主流日志框架的性能表现与适用场景: 标准BALI:适合明确需要保存日志的场景,保存路径短,性能较好 XCO_CP_BAL:API更现代但性能较低,适合需要即时可见性的场景 AML:开源框架,擅长消息缓冲,适合批量处理时暂存消息 测试结果表明: 纯记录不落库时AML最快 需要保存时BALI性能最优 second connection不提升性能但能确保日志留存 选型建议: 高频批处理优先AML+BALI组合 故障诊断考虑XCO的即时可见性

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 214

超大背包问题(回溯法)

题目: 有N个物品,还有一个体积为V的大大大大大背包。 第i个物品,价值为,重量为,每个物品只有1个。 现在可以选择一些物品放入背包,问背包内物品的最大价值可能是多少? 分析: 从题目描述来看,就是一个0-1背包问题,但有些不一样的是,物品的价值,重量都很大,用动态规划来做不现实,动态规划的时间复杂度与背包大小有关。 但是又发现了他的物品数量很少,因此可以暴力搜索,也就是回溯法来做。 还有许多优化的好办法,我就简单介绍一个效果比较好的: 当我们正在选择这一件物品是否需要时,假设我们.

weixin_53731572的博客 674

098、C3k2_Ghost:用 GhostConv 替代 C3k2 内标准卷积的轻量化改造代码

本文介绍了用GhostConv轻量化改造YOLOv11中C3k2模块的实践。作者通过线上部署案例引出问题,详细解析了GhostConv的核心实现逻辑,指出直接替换标准卷积会导致的两个关键问题:通道数不匹配和kernel_size冲突。文章提供了完整的C3k2_Ghost实现代码,包含注意事项和调试技巧。消融实验显示,该方法在小模型上可减少27%-28%参数量、34%-35%FLOPs,仅损失0.8mAP。作者总结了适用场景:小模型效果显著,大模型需谨慎;检测小目标任务不推荐;训练时需调整学习率。最后强调sh

sundong_81的博客 62

超大背包问题(二进制枚举 + 二分)

超大背包问题 第一次看到这一题好像是在某一场比赛,就是给你一个炸空间和时间的背包,让你选最大的价值,看似是01背包然鹅今天在挑战程序设计这本书上看到了这题,看到了作者的做法,感觉豁然开朗,直接暴搜也会炸,但是我们可以把这些物品拆分成两堆,然后我们用二进制枚举两个堆的物品,时间复杂度为\(O(n*2^{(n/2)})\)在枚举第二堆的时候我们就可以在第一个堆里通过二分搜索找到满足条件物品堆,然后选...

小谢的博客 798

新手也能写复杂爬虫!AI+Python自动分析京东商品,提取数据不用F12

不用F12:AI自动分析京东页面,生成选择器;不用懂JS:Playwright自动渲染动态数据;不用改代码:只需配置3个参数,复制运行就能出结果。这套方案不仅适用于京东,修改提示词后还能爬取淘宝、拼多多、亚马逊等电商网站,新手只需掌握“配置参数→运行代码→查看CSV”3步,就能轻松获取任意网站的结构化数据。未来,AI会让爬虫彻底进入“零代码、零门槛”时代,新手也能轻松搞定复杂数据爬取需求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1340

基于Simulink实现电动汽车制动能量回收系统的仿真

通过上述步骤,我们成功实现了基于Simulink的电动汽车制动能量回收系统的仿真研究。该系统能够全面评估制动能量回收系统的性能,验证控制策略的有效性,并通过优化设计提高能量回收效率和制动安全性。引入智能预测:结合人工智能技术,实现更智能的能量回收控制策略。扩展功能:增加对多种车型和制动场景的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。

xiaoheshang_123的博客 336

第十五天打卡——背包问题

背包问题所以背包问题的理论基础重中之重是理解01背包问题。有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i]。,求解将哪些物品装入背包里物品价值总和最大。举个例子,背包最大重量为4。问背包能背的物品最大价值是多少?

m0_72668725的博客 171

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

回溯算法--01背包问题

回溯算法是一种解决问题的通用算法,能够在一个问题的所有解空间中,按深度优先的策略搜索,直到找到所需要的解或者搜索完整个解空间都没有找到解。0-1背包问题是指在限制背包容量的情况下,在一堆物品中选择一部分,使得这些物品的总价值最大。C++ 设计回溯算法解决0-1 背包问题的思路。

m0_63064861的博客 1万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

回溯算法+分支限定解决01背包、完全背包

(一)回溯算法+分支限定解决01背包 //动态规划的背包问题可以看我的之前博客       #include &lt;iostream&gt;     #include &lt;cstdio&gt;     #include &lt;algorithm&gt;     using namespace std; #define MAXN 10     struct Goods_Info ...

杨氏计算机知识整理 2061

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 【模板】回溯法 (八皇后、素数环题解)
下一篇: 【模板】字符串处理 (STL使用)
coderwait
博客等级 码龄9年 20粉丝 210原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值