通过率 55% · 提交 1,099 · 通过 607
小慕正在整理一个旧项目中的文件,想尽可能多地把它们保存到一张软盘里。 但问题在于,这台旧电脑只有一个3.5寸软盘驱动器,没有其他方式可以导出文件,而且手头也只有这一张软盘可用。 因此,这张软盘是小慕唯一可以用来保存文件的载体。 小慕希望尽可能多地将项目中的文件复制到软盘中,使得软盘中文件的总大小最大。 已知这张软盘的容量是1474560字节。 文件在软盘上占用空间时,是按分配的,每个块的大小是512个字节。 一个块只能被一个文件使用。保存到软盘中的文件必须是完整的,不能使用任何压缩技术。
这类题属于华为 OD 机考真题方向中「200分 / DP」方向的高频题型,通常考察对「200分 / DP」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第1行为一个整数N,表示计算机中的文件数量。1 ≤ N ≤ 1000.
接下来的第2行到第N+1行(共N行),每行为一个整数,表示每个文件的大小Si,单位为字节。
0 ≤ i < N,0 ≤ Si <= 1474560
科学家最多能拷贝的文件总大小。
注意为了充分利用软盘空间,将每个文件在软盘上占用的块记录到本子上。即真正占用软盘空间的只有文件内容本身。
示例 1
输入示例
6 400000 200000 200000 200000 400000 400000
输出示例
1400000
从6个文件中,选择3个大小为400000的文件和1个大小为200000的文件,得到最大总大小为1400000。 也可以选择2个大小为400000的文件和3个大小为200000的文件,得到的总大小也是1400000
示例 2
输入示例
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
我们需要在 N 个文件 中挑选出若干个文件,使得总文件大小尽可能地大,因此本题属于一个典型的 背包问题。
但本题中存在一个 坑:文件必须按照 块 进行储存,且一个块只能储存一个文件。块的大小是 512。
假设此时要储存一个大小为 513 的文件,就必须使用 2 个块 来储存,且由于第二个块即使没有填满也不能再用于其他文件的存储,故占用的空间为 1024。
由于软盘总容量为 1474560 字节,一共包含 1474560 // 512 = 2880 个块,而每一个文件所占用的块数,也可以很方便地通过 ceil(file_i / 512) 得到,故我们可以将问题进行转化为如下描述:
对于已知容量为 2880 的背包,我们知道每一个文件所占空间 ceil(file_i / 512) 和价值 file_i,我们如何进行选择使得背包的总价值尽可能地大。
这就将题干描述的复杂情况,转化为了一个相对容易解决的 路径无关、求和最大值 的 01背包问题 了。其解法类似于 【DP】2023A-工作安排。
思路展开 本题的关键一步是换算单位:软盘按块分配空间,每块 512 字节,且一个块不能被两个文件共用,所以一个大小为 value 字节的文件实际占掉的是向上取整的 value/512 个块,代码用整数技巧 (value + 511) / 512 完成向上取整。软盘总容量 1474560 字节恰好等于 2880 个块,于是问题转化为标准 01 背包:背包容量是 m = 2880 个块,每个文件的重量是它占用的块数 spaceList[i],价值是它的实际字节数 valueList[i],目标是让装入软盘的文件字节总和最大。dp[i][j] 表示在前 i 个文件中挑选、占用不超过 j 个块时能保存的最大字节数。转移分两支:当前文件需要的块数超过 j 时只能不选,dp[i][j] = dp[i-1][j];否则在不选与选(dp[i-1][j - space] + value)之间取较大值。要特别注意重量用的是块数、价值用的是字节数,两者不能混用——这正是本题与普通背包模板的差别所在。最终答案是 dp[n][m],即用满 2880 个块的预算能保存的最大字节数。 复杂度分析 设 n 为文件数目,m 为软盘的总块数(固定为 2880)。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
3 737270 737272 737288
输出示例
1474542
3个文件中,每个文件实际占用的大小分别为737280字节、737280字节、737792字节。只能选取前两个文件,总大小为1474542字节。虽然后两个文件总大小更大且未超过1474560字节,但因为实际占用的大小超过了1474560字节,所以不能选后两个文件。
时间限制 1000 ms · 内存限制 128 MB