题目
有一名科学家想要从一台古董电脑中拷贝文件到自己的电脑中加以研究但此电脑除了有一个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;
}