【华为OD机试真题】通过软盘拷贝文件 | 机试真题+思路参考+代码解析(C++)

题目

有一名科学家想要从一台古董电脑中拷贝文件到自己的电脑中加以研究但此电脑除了有一个3.5寸软盘驱动器以外,没有任何手段可以将文件持贝出来,而且只有一张软盘可以使用,因此这一张软盘是唯一可以用来拷贝文件的载体。

科学家想要尽可能多地将计算机中的信息拷贝到软盘中,做到软盘中文件内容总大小最大。已知该软盘容量为1474560字节。文件占用的软盘空间都是按块分配的,每个块大小为512个字节。一个块只能被一个文件使用。拷贝到软盘中的文件必须是完整的,且不能采取任何压缩技术。

题目输入

第1行为一个整数N,表示计算机中的文件数量。1≤ N < 1000。

第2行到第N+1行(共N行),每行为一个整数,表示每个文件的大小 s​,单位为字节.0 < i < N,0< s[i]​< 1000000

题目输出

科学家最多能拷贝的文件总大小。

实例

3

124

623

1652

2399

题目详解

题目代码

C++代码

#include <iostream>
#include <vector>

using namespace std;

int main() {
    // 软盘容量的块数;既背包的容量
    const int BLOCK_VOLUME = 1474560 / 512;
    int n;
    cin >> n;

    // 存储每个文件的大小,物品的价值
    vector<int> sizes(n);
    for (int i = 0; i < n; ++i) {
        cin >> sizes[i];
    }

    // dp数组初始化
    vector<int> dp(BLOCK_VOLUME + 1, 0);

    for (int size : sizes) {
        // 存储文件所占的块数
        int block = (size - 1) / 512 + 1;//物品的重量
        for (int vol = BLOCK_VOLUME; vol >= block; --vol) {
            dp[vol] = max(dp[vol], dp[vol - block] + size);
        }
    }

    cout << dp[BLOCK_VOLUME] << endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

l939035548

一个小目标不多,一分不少。。。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值