news 2026/7/22 16:24:18

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
P1049 [NOIP 2001 普及组] 装箱问题

记录157

#include<bits/stdc++.h> using namespace std; int n,v,a[35]; int min_remain=2e4+10;// 记录最小剩余空间,初始化为一个比V大的数 void dfs(int remain_v,int num){// remain_v: 当前剩余体积, num: 当前考虑到了第几个物品 if(num>n){ // 1. 终止条件:所有物品都考虑完了 min_remain=min(min_remain,remain_v); return; } //剪枝:如果当前剩余空间已经比历史最优解还大,没必要继续了(可选优化) // if(remain_v >= min_remain) return; //其实选择当前节点就是一个缩小的过程,剪枝没用到 dfs(remain_v,num+1); if(remain_v>=a[num]){ dfs(remain_v-a[num],num+1); } } 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; }

题目传送门https://www.luogu.com.cn/problem/P1049


前言

我是一名专注信奥赛(CSP-J/S、NOIP)的教练。

  • 如果你觉得这篇题解对你有帮助,欢迎点击关注我的CSDN账号,我会持续更新高质量算法解析。
  • 我深知算法思维的构建远比单纯通过题目更重要,本系列题解不局限于AC代码的堆砌,而是致力于拆解题目背后的逻辑链条与核心知识点
  • 备赛路上若遇瓶颈,欢迎随时评论或私信,我将甄选典型疑难问题,通过视频讲解或撰写专项文章的形式,为你提供深度答疑。

核心解题思路

这道题是一道非常经典的搜索(DFS)与回溯问题,也可以看作是 0-1 背包问题的变种。

  1. 问题转化(0-1 选择模型)
    题目要求从 nn 个物品中选取若干个,使得装入箱子的总体积最大,从而让剩余空间最小。对于每一个物品,我们都只有两种选择:装入箱子或者不装入箱子。这构成了一个典型的二叉树搜索空间。

  2. 算法设计(深度优先搜索 DFS)
    我们可以使用深度优先搜索(DFS)来遍历所有可能的组合情况。在搜索过程中,我们维护两个关键状态:当前的剩余体积remain_v和当前正在考虑的物品编号num

    • 当考虑第num个物品时,首先选择不装入,剩余体积不变,继续搜索下一个物品。
    • 然后判断如果当前剩余体积大于等于该物品的体积,则选择装入,更新剩余体积,继续搜索下一个物品。
    • 当所有物品都考虑完毕(num > n)时,到达叶子节点,此时用当前的剩余体积去更新全局的最小剩余空间。

代码分块详细解释

1. 全局变量定义与初始化

#include<bits/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初始化为2e4+10(即 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, num+1)跳过当前物品,探索后续组合保证了“也可以不取”这一题目条件的正确实现
选分支dfs(remain_v-a[num], num+1)在容量允许时装入当前物品实现了 0-1 背包的核心状态转移,并自动完成了空间约束检查
搜索启动dfs(v, 1)以满容量和第一个物品为起点确立了整个二叉树搜索空间的根节点状态
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/22 16:23:08

Ajax异步请求解析,打通前后端,看这一篇就够了

目录 一. 异步请求举例 二. Ajax 异步请求详解 2.1 Ajax 简介 2.2 XMLHttpResponse对象的属性和方法 2.3 ajax() 的使用方式 三. Ajax 请求代码举例 3.1 确认用户名是否被占用例子 3.1.1 用户注册界面展示 3.1.2 前端用户注册表单代码 3.1.3 前端 JavaScript 发送 Aj…

作者头像 李华
网站建设 2026/7/22 16:22:58

AIGC率能不能降到个位数?讲清原理实测降到合格

AIGC率能不能降到个位数&#xff1f;讲清原理实测降到合格 你心里大概憋着一个问题&#xff1a;AIGC率到底能不能真降到个位数&#xff1f;还是说折腾半天&#xff0c;顶多勉强压到合格线上下&#xff0c;随时可能被打回来&#xff1f;你看着报告上那个刺眼的数字&#xff0c;…

作者头像 李华
网站建设 2026/7/22 16:22:18

namae背后的技术:React组件设计与多平台API集成原理

namae背后的技术&#xff1a;React组件设计与多平台API集成原理 【免费下载链接】namae ☕️ Grab a slick name for your new project 项目地址: https://gitcode.com/gh_mirrors/na/namae namae是一个帮助开发者快速检查项目名称在多平台可用性的工具&#xff0c;通过…

作者头像 李华
网站建设 2026/7/22 16:20:41

基于TI DM642与RF-5框架的MPEG-2实时编解码系统设计与调优

1. 项目概述与核心价值在嵌入式多媒体处理领域&#xff0c;实时视频编解码一直是个硬骨头。尤其是在二十年前&#xff0c;当德州仪器&#xff08;TI&#xff09;的TMS320DM642这类高性能数字信号处理器&#xff08;DSP&#xff09;刚面世时&#xff0c;如何在其上稳定、高效地跑…

作者头像 李华
网站建设 2026/7/22 16:18:46

网络热词“那什么的交互“的传播与沟通密码

1. 从"那什么的交互"看当代互联网的沟通困境最近在各大社交平台上频繁看到"那什么的交互"这个表达&#xff0c;乍看莫名其妙&#xff0c;细想却颇有深意。这个看似不完整的短语&#xff0c;恰恰精准捕捉了当代数字原住民在线上交流时的某种微妙状态——那种…

作者头像 李华
网站建设 2026/7/22 16:18:18

小白程序员必备:大模型研究助手反查纠错,让报告更可信!

本文介绍了研究助手在生成报告后的反查纠错步骤&#xff0c;通过识别高风险断言、设计second-pass reviewer&#xff0c;并采用反向搜索等方法&#xff0c;确保报告结论有足够证据支持&#xff0c;避免过强表达。文章详细讲解了断言抽取、来源绑定、反向搜索和降级修订的流程&a…

作者头像 李华