P1049 [NOIP 2001 普及组] 装箱问题
记录157#includebits/stdc.h using namespace std; int n,v,a[35]; int min_remain2e410;// 记录最小剩余空间初始化为一个比V大的数 void dfs(int remain_v,int num){// remain_v: 当前剩余体积, num: 当前考虑到了第几个物品 if(numn){ // 1. 终止条件所有物品都考虑完了 min_remainmin(min_remain,remain_v); return; } //剪枝如果当前剩余空间已经比历史最优解还大没必要继续了可选优化 // if(remain_v min_remain) return; //其实选择当前节点就是一个缩小的过程剪枝没用到 dfs(remain_v,num1); if(remain_va[num]){ dfs(remain_v-a[num],num1); } } int main(){ ios::sync_with_stdio(false); cin.tie(0); cinvn; for(int i1;in;i) cina[i]; dfs(v,1); coutmin_remain; return 0; }题目传送门https://www.luogu.com.cn/problem/P1049前言我是一名专注信奥赛CSP-J/S、NOIP的教练。如果你觉得这篇题解对你有帮助欢迎点击关注我的CSDN账号我会持续更新高质量算法解析。我深知算法思维的构建远比单纯通过题目更重要本系列题解不局限于AC代码的堆砌而是致力于拆解题目背后的逻辑链条与核心知识点备赛路上若遇瓶颈欢迎随时评论或私信我将甄选典型疑难问题通过视频讲解或撰写专项文章的形式为你提供深度答疑。核心解题思路这道题是一道非常经典的搜索DFS与回溯问题也可以看作是 0-1 背包问题的变种。问题转化0-1 选择模型题目要求从 nn 个物品中选取若干个使得装入箱子的总体积最大从而让剩余空间最小。对于每一个物品我们都只有两种选择装入箱子或者不装入箱子。这构成了一个典型的二叉树搜索空间。算法设计深度优先搜索 DFS我们可以使用深度优先搜索DFS来遍历所有可能的组合情况。在搜索过程中我们维护两个关键状态当前的剩余体积remain_v和当前正在考虑的物品编号num。当考虑第num个物品时首先选择不装入剩余体积不变继续搜索下一个物品。然后判断如果当前剩余体积大于等于该物品的体积则选择装入更新剩余体积继续搜索下一个物品。当所有物品都考虑完毕num n时到达叶子节点此时用当前的剩余体积去更新全局的最小剩余空间。代码分块详细解释1. 全局变量定义与初始化#includebits/stdc.h using namespace std; int n, v, a[35]; int min_remain 2e4 10; // 记录最小剩余空间初始化为一个比V大的数详细分析n记录物品总数v记录箱子的总容量数组a用来存储每个物品的体积。min_remain是一个全局变量用来记录在搜索过程中找到的最小剩余空间。由于题目保证 V≤20000所以将min_remain初始化为2e410即 20010确保它比任何可能的剩余空间都要大从而保证第一次更新时一定能成功。2. 核心逻辑DFS 搜索与状态转移void dfs(int remain_v, int num){ // remain_v: 当前剩余体积, num: 当前考虑到了第几个物品 if(num n){ // 1. 终止条件所有物品都考虑完了 min_remain min(min_remain, remain_v); return; } // 选择1不装当前物品直接考虑下一个 dfs(remain_v, num 1); // 选择2装当前物品前提是剩余空间足够 if(remain_v a[num]){ dfs(remain_v - a[num], num 1); } }详细分析这是代码的灵魂所在完美体现了回溯法“选与不选”的思想。递归终止条件当num n时说明前 nn 个物品都已经做出了选择当前分支的搜索已经结束。此时用min()函数将当前的剩余体积remain_v与全局最优解min_remain进行比较保留较小的值。不装入分支无论当前物品是否能装下我们都可以选择不装它。因此保持remain_v不变直接递归调用dfs(remain_v, num 1)去处理下一个物品。装入分支只有在当前剩余体积remain_v大于等于当前物品体积a[num]的前提下我们才能选择装入它。装入后剩余体积减少为remain_v - a[num]然后递归调用dfs(remain_v - a[num], num 1)去处理下一个物品。3. 主函数数据读入与启动搜索int main(){ ios::sync_with_stdio(false); cin.tie(0); cin v n; for(int i 1; i n; i) cin a[i]; dfs(v, 1); cout min_remain; return 0; }详细分析主函数负责读取箱子的总容量v和物品数量n以及所有物品的体积。随后以初始剩余体积v和起始物品编号1作为参数调用dfs(v, 1)启动深度优先搜索。搜索结束后直接输出全局记录的最小剩余空间min_remain即可。核心逻辑总结表代码模块核心变量/操作精炼作用解决的痛点全局最优记录min_remain min(...)记录搜索过程中的最小剩余空间避免了复杂的返回值传递直接在叶子节点更新全局最优解递归终止条件if(num n)判断是否所有物品都已处理完毕标志着一条完整搜索路径的结束是更新最优解的触发点不选分支dfs(remain_v, num1)跳过当前物品探索后续组合保证了“也可以不取”这一题目条件的正确实现选分支dfs(remain_v-a[num], num1)在容量允许时装入当前物品实现了 0-1 背包的核心状态转移并自动完成了空间约束检查搜索启动dfs(v, 1)以满容量和第一个物品为起点确立了整个二叉树搜索空间的根节点状态

相关新闻

P1071 [NOIP 2009 提高组] 潜伏者

P1071 [NOIP 2009 提高组] 潜伏者

记录156 #include<bits/stdc.h> using namespace std;int main() {// 优化IO速度ios::sync_with_stdio(false);cin.tie(0);string s1,s2,s3;cin>>s1>>s2>>s3;// 1. 定义两个 map// decode_map[密文字符] 明文字符map<char,char> decode_map; /…

2026/7/22 16:24:35 阅读更多 →
鸿蒙 ArkTS 实战:Taxi Fare Estimator 从打车费用估算到出行费用应用完整解析

鸿蒙 ArkTS 实战:Taxi Fare Estimator 从打车费用估算到出行费用应用完整解析

鸿蒙 ArkTS 实战&#xff1a;Taxi Fare Estimator 从打车费用估算到出行费用应用完整解析 前言 打车费用估算 是一个典型的鸿蒙 ArkTS 轻量工具页面。它围绕“根据车型、里程和等待时间估算打车费用&#xff0c;支持快车、专车和豪华三种计价模型。”这个明确需求&#xff0c…

2026/7/22 16:24:35 阅读更多 →
TI PRCM时钟源选择:从寄存器配置到系统级时钟管理实战

TI PRCM时钟源选择:从寄存器配置到系统级时钟管理实战

1. 项目概述&#xff1a;从寄存器手册到系统级时钟设计如果你和我一样&#xff0c;常年泡在嵌入式底层开发里&#xff0c;那对TI&#xff08;德州仪器&#xff09;的PRCM模块一定不陌生。手册里那些密密麻麻的寄存器位域描述&#xff0c;像MPU_CLKSRC、VIDEO_PLL_CLKSRC&#x…

2026/7/22 16:23:34 阅读更多 →

最新新闻

如何在Windows电脑上轻松运行安卓应用:3种轻量级安卓模拟器方案对比

如何在Windows电脑上轻松运行安卓应用:3种轻量级安卓模拟器方案对比

如何在Windows电脑上轻松运行安卓应用&#xff1a;3种轻量级安卓模拟器方案对比 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾想过在Windows电脑上直接运行安…

2026/7/22 17:12:02 阅读更多 →
Linux基础知识总结3

Linux基础知识总结3

感觉Linux这个知识总结可以写很久 &#xff0c;文件目录类pwd指令1.基本语法&#xff1a;pwd2.显示当前工作目录的绝对路径pwd /home/user/documentsls指令1.基本语法&#xff1a;ls [选项][目录或是文件]2.常用选项-a&#xff1a;显示当前目录所有的文件和目录&#xff0c;包括…

2026/7/22 17:12:02 阅读更多 →
117、HDR多帧融合算法:曝光序列、运动鬼影消除与合成权重的高效实现

117、HDR多帧融合算法:曝光序列、运动鬼影消除与合成权重的高效实现

117、HDR多帧融合算法:曝光序列、运动鬼影消除与合成权重的高效实现 从一次夜拍翻车说起 去年调试某款旗舰机的主摄HDR,客户反馈夜景模式下拍路灯,灯杆周围总有一圈“鬼影”——不是镜头flare,是算法把不同帧的灯杆边缘叠歪了。我盯着log看了三天,发现是运动检测模块把灯…

2026/7/22 17:12:02 阅读更多 →
Milvus 向量数据库完全指南

Milvus 向量数据库完全指南

1. 深度介绍1.1 Milvus 是什么&#xff1f;Milvus 是一款云原生、开源的向量数据库。在电商场景中&#xff0c;它不仅能通过关键词匹配商品&#xff0c;更能理解用户的“模糊意图”。例如用户搜索“适合夏天穿的透气运动鞋”&#xff0c;传统搜索引擎可能只能匹配包含这些词的商…

2026/7/22 17:12:02 阅读更多 →
Bloc状态管理_Flutter在鸿蒙平台基于流的状态管理方案

Bloc状态管理_Flutter在鸿蒙平台基于流的状态管理方案

作者&#xff1a;付文龙&#xff08;红目香薰&#xff09; 仓库地址&#xff1a;https://gitcode.com/feng8403000/FlutterfromBeginnertoAdvancedForHarmonyOS.git 联系邮箱&#xff1a;372699828qq.com 概述 Bloc&#xff08;Business Logic Component&#xff09;是一种基…

2026/7/22 17:12:02 阅读更多 →
从PubMed到arXiv,AI搜索精准抓取“被引但未列”的关键文献:科研反脆弱性构建的第4范式(独家算法白皮书节选)

从PubMed到arXiv,AI搜索精准抓取“被引但未列”的关键文献:科研反脆弱性构建的第4范式(独家算法白皮书节选)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;从PubMed到arXiv&#xff0c;AI搜索精准抓取“被引但未列”的关键文献&#xff1a;科研反脆弱性构建的第4范式&#xff08;独家算法白皮书节选&#xff09; 传统文献检索常陷入“可见性陷阱”&#xff…

2026/7/22 17:11:02 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统&#xff0c;尤其是像TI C6000系列这样的高性能DSP开发中&#xff0c;我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动&#xff0c;但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案&#xff1f; 在数字化协作环境中&#xff0c;消息通知系统的重要性不言而喻明。但现实情况是&#xff0c;企业级通知方案往往需要复杂的API对接&#xff08;如企业微信、钉钉、飞书&#xff09;&#xff0c;个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点"&#xff0c;乙方听到的是"少做几页"。甲方说"不要太复杂"&#xff0c;乙方理解成"别放图表了"。结果交过去&#xff0c;甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里&#xff0c;是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中&#xff0c;我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源&#xff0c;还是配置文件、证书等&#xff0c;都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下&#xff0c;但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP&#xff08;轻量级目录访问协议&#xff09;作为企业级身份认证的黄金标准&#xff0c;已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时&#xff0c;发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”&#xff0c;而是以可解释、可审计、可迭代的方式&#xff0c;赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻