笔试题11 -- 装箱问题(01背包)

装箱问题(01背包)

文章目录

  • 装箱问题(01背包)
    • 一、原题复现
    • 二、思路剖析
    • 三、示例代码

题目链接:NOIP2001装箱问题

一、原题复现

题目描述

有一个箱子容量为V(正整数,0 ≤ V ≤ 20000),同时有n个物品(0<n ≤ 30),每个物品有一个体积(正整数)。
要求n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

输入描述:

  • 1个整数,表示箱子容量
  • 1个整数,表示有n个物品
  • 接下来n行,分别表示这n个物品的各自体积

输出描述:

1个整数,表示箱子剩余空间。

输入

24
6
8
3
12
7
9
7

输出

0

二、思路剖析

  1. 首先观察题中希望得到剩余空间最小时剩余的空间值,要达到该要求,需要我们塞入体积总和尽可能多的物体。由于每个物体的体积都是正数,不妨我们将最终推测的目标转换为从众多物品中选取,在总体积不超过V的情况下,使得箱子内的物品总体积尽可能大。最终返回的结果即:“V - 最大总体积”。

  2. 对于每个物品,他们都有各自对应的体积大小,同时对于达成最终目标而言,都有选择与不被选择两种情况,这两种情况可以分别表示为 ‘0’, ‘1’ ,所以该题应该将 01 背包问题纳入考虑范围。

  3. 因为有总体积不超过V的限制,所以我们dp数组递推的过程有一个字段是**“峰值容量”**,它的递推范围为 [0, V]。当然,峰值容量为0时,不能装任何物品,那么该字段为0对应的dp表空位可以直接初始化为0。

  4. 同样地,因为有n个物品,对他们进行标号,也就有了另外一个字段为**“物品序号”**,递推范围为 [1, n],直接表示为第i个物品。

  5. 通过上面 (3)、(4) 的分析,最终的 dp 表在两字段对应都需要多开一个位置,便于初始化完成后,对剩余位置的循环递推赋值。不妨设定 i 为前 i 件物品理由:由于判断第 i 物品时,峰值容量是否足够容纳该物品,而判断总体积时前面的物品也已经装在箱子中,j 为箱子内可容纳的峰值容量。 dp[i] [j] 表示前 i 件物品,在总体积不超过 j 的情况下,箱子内的最大体积。

  6. 截止目前我们已经确定了dp表,以及 dp[i] [j] 的含义和 i ,j 的递推范围。那怎么通过其他表格内的信息推出 dp[i] [j] 的值呢?假定存储物品的数组声明为"vec",我们知道对于第 i 个物品存在 选、不选 两种情况:

    • 不选:那么前 i 位置相对于前 i - 1 位置,vec[i]的值就没有叠加,故 dp[i] [j] = dp[i - 1] [j]
    • 选:对于选而言,有个重要的前提,即为当前峰值容量(j) 减去当前物品的体积(vec[i]) 是否大于0。如果大于等于0,说明如果箱内为空可以容纳下该物体,那么此时的最大体积为前 i - 1 个物体,箱子峰值容量为 j - vec[i] 处对应的值加上 vec[i],即 dp[i - 1] [j - vec[i]] + vec[i]。另外一种递推渠道 dp[i - 1] [j],最终 dp[i] [j] 位置的值取两者的最大值即可;如果小于0,递推来源就只能是 dp[i - 1] [j],即 dp[i] [j] = dp[i - 1] [j]

在这里插入图片描述

  1. 填表顺序也通过上面分析变得很清晰了,最终状态是什么呢? 回到开始,我们将问题转换为利用dp表求在总体积不超过V的情况下,使得箱子内的物品总体积尽可能大。所以,最终状态对应的值为 dp[n] [v],注意我们循环递推填表下标从 1 开始。最后得到的结果即 v - dp[n] [v]

三、示例代码

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;int main()
{int v = 0, n = 0;cin >> v >> n;vector<int> vec(n + 1, 0);for(int i = 1; i <= n; i++){cin >> vec[i];}// dp[i][j]: 表示前i个物品,容量不超过j的情况下,箱子的峰值容量vector<vector<int>> dp(n + 1, vector<int>(v + 1));for(int i = 1; i <= n; i++){for(int j = 1; j <= v; j++){dp[i][j] = (j < vec[i])? (dp[i - 1][j]): (max(dp[i - 1][j], dp[i - 1][j - vec[i]] + vec[i]));}}auto result = v - dp[n][v];cout << result << endl;return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/8435.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【D3.js in Action 3 精译_038】4.2 D3 折线图的绘制方法及曲线插值处理

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一部分 D3.js 基础知识 第一章 D3.js 简介&#xff08;已完结&#xff09; 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知1.3 数据可视化最佳实践&#xff08;上&#xff09;1.3 数据可…

测试-正交表与工具pairs的介绍使用(1)

目录 正交表 生成正交表 步骤 实操 注意事项 编写测试用例 根据正交表编写测试用例 补充遗漏的重要测试用例 正交表 关于长篇大论也不多介绍了&#xff0c;我们只需要知道正交法的⽬的是为了减少⽤例数⽬&#xff0c;⽤尽量少的⽤例覆盖输⼊的两两组合 正交表的构成&…

抗晃电马达保护器在工业厂房中的应用

安科瑞刘鸿鹏 摘要 随着工业自动化水平的提高&#xff0c;生产线上电动机作为关键设备的使用频率不断增加。然而&#xff0c;工厂生产环境中的电力波动&#xff0c;尤其是晃电现象&#xff0c;会对电动机的正常运转造成干扰&#xff0c;甚至导致设备停机和生产中断。抗晃电型…

linux之调度管理(2)-调度器 如何触发运行

一、调度器是如何在程序稳定运行的情况下进行进程调度的 1.1 系统定时器 因为我们主要讲解的是调度器&#xff0c;而会涉及到一些系统定时器的知识&#xff0c;这里我们简单讲解一下内核中定时器是如何组织&#xff0c;又是如何通过通过定时器实现了调度器的间隔调度。首先我们…

RHCE循环执行的例行性任务--crontab(周期性)

1.每分钟执行命令 2.每小时执行 3.每天凌晨3点半和12点半执行脚本 4.每隔6小时&#xff0c;相当于6,12,18,24点半执行脚本 5.30半点&#xff0c;8-18/2表示早上8点到下午18点之间每隔2小时执行脚本代表 6.每天晚上9点30重启nginx 7.每月1号和10号4点45执行脚本 8. 每周六和周日…

ETLCloud异常问题分析ai功能

在数据处理和集成的过程中&#xff0c;异常问题的发生往往会对业务运营造成显著影响。为了提高ETL&#xff08;提取、转换、加载&#xff09;流程的稳定性与效率&#xff0c;ETLCloud推出了智能异常问题分析AI功能。这一创新工具旨在实时监测数据流动中的潜在异常&#xff0c;自…

Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 基于Spring Boot的个人云盘管理系统设计…

还在为慢速数据传输苦恼?Linux 零拷贝技术来帮你!

前言 程序员的终极追求是什么&#xff1f;当系统流量大增&#xff0c;用户体验却丝滑依旧&#xff1f;没错&#xff01;然而&#xff0c;在大量文件传输、数据传递的场景中&#xff0c;传统的“数据搬运”却拖慢了性能。为了解决这一痛点&#xff0c;Linux 推出了 零拷贝 技术&…

密码学是如何保护数据传输的安全性?

密码学通过一系列算法和协议来保护数据传输的安全性。 一、加密技术 对称加密算法 原理&#xff1a;使用相同的密钥进行加密和解密。应用&#xff1a;在数据传输过程中&#xff0c;发送方和接收方共享一个密钥&#xff0c;数据在传输前被加密&#xff0c;接收方使用相同的密钥…

python怎么打开py文件

1、首先在资源管理器里复制一下py文件存放的路径&#xff0c;按下windows键&#xff0b;r&#xff0c;在运行里输入cmd&#xff0c;回车打开命令行&#xff1a; 2、在命令行里&#xff0c;先切换到py文件的路径下面&#xff0c;接着输入“python 文件名.py ”运行python文件&a…

云计算——ACA学习 云计算核心技术

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​ 写在前面 本系列将会持续更新云计算阿里云ACA的学习&#xff0c;了解云计算及网络安全相关…

企业办公管理软件排名 | 九款企业管理软件助你制胜职场!(好用+实用+全面)

在寻找合适的企业办公管理软件时&#xff0c;你是否感到困惑不已&#xff0c;不知道从众多选项中选择哪一个&#xff1f; 一款好的管理软件不仅能简化工作流程&#xff0c;还能增强数据安全性&#xff0c;优化决策支持。 以下是九款备受推崇的企业管理软件&#xff0c;它们将助…

DNS服务器

DNS服务器 1、简介 DNS域名解析服务器&#xff0c;它作为将域名和IP地址相互映射的一个分布式数据库&#xff0c;端口号为53&#xff0c;通常使用UDP协议&#xff0c;但是在没有查询到完整的信息时&#xff0c;会以TCP这个协议来重新查询&#xff0c;所以在启动NDS服务器时&a…

顾荣辉在新加坡金融科技节发表主旨演讲:安全不仅是竞争优势,更是共同责任

在全球数字化和去中心化进程中&#xff0c;Web3的作用日益凸显&#xff0c;安全问题也日益成为行业的焦点。在这一背景下&#xff0c;顾荣辉教授于新加坡金融科技节&#xff08;SFF&#xff09;上发表主旨演讲《超越代码&#xff0c;引领信任》。顾教授在演讲中深入阐述了安全在…

Leetcode328奇偶链表,Leetcode21合并两个有序链表,Leetcode206反转链表 三者综合题

题目描述 思路分析 这题的思路就和我们的标题所述一样&#xff0c;可以看作是这3个题的合并&#xff0c;但是稍微还有一点点区别 比如&#xff1a;奇偶链表这道题主要是偶数链在了奇数后面&#xff0c;字节这个的话是奇偶链表分离了 所以字节这题的大概思路就是&#xff1a; …

「Mac玩转仓颉内测版1」入门篇1 - Cangjie环境的搭建

本篇详细介绍在Mac系统上快速搭建Cangjie开发环境的步骤&#xff0c;涵盖VSCode的下载与安装、Cangjie插件的离线安装、工具链的配置及验证。通过这些步骤&#xff0c;确保开发环境配置完成&#xff0c;为Cangjie项目开发提供稳定的基础支持。 关键词 Cangjie开发环境搭建VSC…

2023数学分析【南昌大学】

计算 求极限 lim ⁡ n → ∞ ( 1 n 2 + 1 2 + 1 n 2 + 2 2 + ⋯ + 1 n 2 + n 2 ) \mathop{\lim }\limits_{n \to \infty } \left( \frac{1}{{\sqrt {n^2 + 1^2} }} + \frac{1}{{\sqrt {n^2 + 2^2} }} + \cdots + \frac{1}{{\sqrt {n^2 + n^2} }} \right) n→∞lim​(n2+12 ​1…

从技术创新到商业应用,智象未来(HiDream.ai)创新不止步

在人工智能领域的最新动态中&#xff0c;智象未来&#xff08;HiDream.ai&#xff09;公司&#xff0c;作为全球领先的多模态生成式人工智能技术先驱&#xff0c;已经引起了广泛的行业瞩目。该公司专注于深度学习和计算机视觉技术的融合&#xff0c;致力于开发和优化视觉多模态…

ssm基于Vue的戏剧推广网站+vue

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习&#xff0c;获取源码看文章最下面 需要定制看文章最下面 目 录 摘 要 I Abstract II 第1章 绪论 1 1.1 课题背景 1 1.2 课题意义 1 1.3 研究内容 1 第2…

利用泰勒公式近似计算10的平方根

文章目录 1. 泰勒公式是什么2、利用泰勒公式计算 10 \sqrt{10} 10 ​第 1 步&#xff1a;泰勒级数展开第 2 步&#xff1a;计算各阶导数第 3 步&#xff1a;在 x 9 x 9 x9 处计算各阶导数第 4 步&#xff1a;构建各阶泰勒展开式第 5 步&#xff1a;计算 f ( 10 ) f(10) f(1…