P1049 [NOIP 2001 普及组] 装箱问题

发布时间:2026/10/22 11:44:24

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)以满容量和第一个物品为起点确立了整个二叉树搜索空间的根节点状态
延伸阅读

更多相关文章

2026/10/22 2:43:08

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/10/21 19:50:06

AI模型训练卡顿真相大起底(2024性能分析工具实测报告)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;AI模型训练卡顿现象的系统性归因 AI模型训练过程中出现的卡顿并非孤立故障&#xff0c;而是多层级资源协同失衡的外在表征。从硬件层到框架层&#xff0c;再到算法与数据流设计&#xff0c;任一环节的隐性瓶颈…

2026/10/22 11:40:04

华为LTE网优L3-2题库的实战诊断方法论

简介&#xff1a;本资源是一份面向通信工程从业者、LTE网络优化工程师及备考华为L3认证人员的专业题库解析文档&#xff0c;聚焦5G演进前的LTE网优核心考点与实操排错逻辑。内容涵盖传播延时建模、PCI冲突影响、MBSFN参考信号配置、VoLTE/CSFB改造对比、RRU-BBU传输故障诊断工具…

2026/10/22 11:40:04

离散数学复习题PDF高效刷题法:把含答案资料变成考点地图

简介&#xff1a;这份资料为山东大学《离散数学》课程配套复习题&#xff08;含答案&#xff09;&#xff0c;面向计算机及相关专业本科生期末备考&#xff0c;也适合自学离散数学者巩固核心概念。资料系统覆盖集合论、命题与谓词逻辑、图论、组合数学、布尔代数、递归与归纳、…

2026/10/22 11:40:04

华为LTE网优L3-2实战:KPI-告警-信令三步穿透法

简介&#xff1a;本资源是一份面向通信工程从业者与LTE网络优化初/中级工程师的华为L3级网优考点精练文档&#xff0c;聚焦5G演进背景下的LTE核心网优原理与实操辨析。内容涵盖传播延时建模、PCI冲突影响、MBSFN参考信号配置、VoLTE与CSFB改造对比、RRU-BBU传输排障工具选择、P…

2026/10/22 11:40:04

Spring Boot发送QQ邮箱邮件:530/535错误排查与SMTP配置指南

Spring Boot 发送 QQ 邮箱邮件&#xff1a;从 530/535 错误到成功发送的全踩坑指南先说说我为什么写这篇。前阵子给一个项目加用户注册后的邮件验证码通知功能&#xff0c;技术栈就是 Spring Boot&#xff0c;邮箱选的 QQ 邮箱——因为项目方要求必须用 QQ 邮箱作为发件账号&am…

2026/10/22 11:40:03

知识工作插件体系全解析:从架构设计到实战搭建

1. 从“知识工作插件”这个命名说起&#xff1a;它到底想解决什么问题第一次看到knowledge-work-plugins这个命名&#xff0c;我的直觉是&#xff1a;这不是一个普通的工具库&#xff0c;而是一套面向“知识工作者”的扩展机制。所谓知识工作者&#xff0c;说白了就是那些每天跟…

2026/10/22 11:35:01

风电不确定性下基于DRO-LDR的机组组合Matlab实现

风电出力的不确定性&#xff0c;是机组组合&#xff08;Unit Commitment&#xff09;里绕不开的一座山。电网调度给风电一个预测出力&#xff0c;但实际风况根本不是那个值&#xff0c;波动起来可能相差很大。传统做法要么把风电当成确定的点值&#xff0c;要么用一堆场景去逼近…

2026/10/22 11:29:28

金融AI落地指南:从调研报告到技术选型与工程实践

简介&#xff1a;这份PDF报告聚焦2025年金融服务业中国AI现状与趋势&#xff0c;面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者&#xff0c;帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件&#xff0c;大小约1…

2026/10/22 0:01:49

电商智能运营体系从0到1:架构设计、落地步骤与避坑指南

前两年我们团队接了一个电商平台的运营中台项目&#xff0c;目标很直白&#xff1a;把过去靠运营拍脑袋做的选品、定价、发券、推活动这些事&#xff0c;逐步用数据算法和自动化流程代替。项目名字内部就叫“电商智能运营体系”。最近有不少朋友问我当时是怎么设计的、踩过哪些…

2026/10/22 0:01:49

若依框架AI代码生成不稳定?用Agent Skill三层结构+五步法搞定

最近一段时间&#xff0c;我一直想把后台管理系统里那些机械重复的增删改查代码交给AI去写。框架用的是若依&#xff0c;按理说这类业务代码模式非常固定&#xff0c;应该是AI最擅长的事情。可真试下来却不是那么回事——你让AI生成一个用户管理模块&#xff0c;它给出的Contro…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑