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/24 0:50:08 阅读更多 →
鸿蒙 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 阅读更多 →

最新新闻

大一学生想学数据分析,先学 Excel 还是 AI 工具?

大一学生想学数据分析,先学 Excel 还是 AI 工具?

刚踏入大学校园&#xff0c;不少经管、人文、计算机专业的新生都萌生了学习数据分析的想法&#xff0c;但几乎所有人都会陷入同一个选择困境&#xff1a;入门阶段优先深耕 Excel&#xff0c;还是直接上手各类 AI 分析工具&#xff1f;当下生成式 AI 普及&#xff0c;很多短视频…

2026/7/24 0:49:45 阅读更多 →
大学生想做数据分析,大学四年完整准备路径

大学生想做数据分析,大学四年完整准备路径

在数字化转型加速的当下&#xff0c;数据分析已成为互联网、金融、零售、制造业通用核心岗位。LinkedIn 2026 年统计 2500 条国内数据分析招聘需求显示&#xff0c;SQL、Python、可视化工具、AI 辅助分析四大能力是企业筛选应届生的硬性标准&#xff0c;仅 32% 应届毕业生在校完…

2026/7/24 0:49:45 阅读更多 →
Power BI | 为啥你的 Power BI 刷新巨慢?

Power BI | 为啥你的 Power BI 刷新巨慢?

数据源慢&#xff1f;服务器性能不够&#xff1f; 为什么你的报表刷新巨慢&#xff0c;可能是你没搞懂查询折叠✦ 本期核心问题 不是数据源慢&#xff0c;是你把1200万行全拉到本地算。 01、刷新6分钟&#xff0c;谁都不承认 小李负责的销售日报&#xff0c;每天早上8:30自动刷…

2026/7/24 0:49:45 阅读更多 →
从注射到口服:Lipfendra如何重塑高胆固醇血症长期管理的日常场景【海得康】

从注射到口服:Lipfendra如何重塑高胆固醇血症长期管理的日常场景【海得康】

高LDL-C是动脉粥样硬化性心血管疾病的核心可控危险因素&#xff0c;而ASCVD至今仍是全球排名第一的死亡原因&#xff0c;全球范围内有超过数亿患者需要长期接受强化降脂治疗。过去数十年间&#xff0c;临床降脂治疗始终存在难以破解的“疗效与便捷性矛盾”&#xff1a;他汀类药…

2026/7/24 0:49:45 阅读更多 →
WAIC2026 洞察:具身智能驶入量产时代,望获 OS 筑牢国产实体 AI 底层根基

WAIC2026 洞察:具身智能驶入量产时代,望获 OS 筑牢国产实体 AI 底层根基

为期数日的 2026 世界人工智能大会&#xff08;WAIC&#xff09;圆满落幕&#xff0c;作为全球人工智能产业风向标&#xff0c;本届大会清晰勾勒出行业迭代新方向。过往数年&#xff0c;人形机器人、服务机器人参展&#xff0c;大多以舞蹈互动、特技翻转、趣味展演吸引观众目光…

2026/7/24 0:48:45 阅读更多 →
Spring 源码系列(8): 依赖注入(DI)在源码里如何发生

Spring 源码系列(8): 依赖注入(DI)在源码里如何发生

引子 你只写了 Autowired private UserService userService;&#xff0c;对象就自动出现了。这背后 Spring 到底做了什么&#xff1f; 本篇回答三件事&#xff1a;① DI 发生在哪一步&#xff1b;② Autowired 和 Resource 的区别在源码层如何体现&#xff1b;③ 字段 / 构造器…

2026/7/24 0:48:45 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化&#xff0c;核心特色&#xff1a;三维 X/Y/Z 三轴空间&#xff0c;所有散点分布在 0~10 立方体空间内&#xff1b;散点使用径向渐变实现立体 3D 圆球质感&#xff1b;支持鼠标 / 触屏拖拽画布&#xff0c;…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls&#xff1a;进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值&#xff0c;并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好&#xff0c;我是一名编程初学者&#xff0c;同时这也是我编程学习之路上的第一篇博客。在这里&#xff0c;我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手&#xff0c;目前在学习c语言&#xff0c;我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

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/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

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

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

2026/7/23 17:49:47 阅读更多 →

月新闻