问题描述:
有一名科学家想要从一台古董电脑中拷贝文件到自己的电脑中加以研究。但此电脑除了有一个3.5寸软盘驱动器以外,没有任何手段可以将文件持贝出来,而且只有一张软盘可以使用。因此这一张软盘是唯一可以用来拷贝文件的载体。科学家想要尽可能多地将计算机中的信息拷贝到软盘中,做到软盘中文件内容总大小最大。
- 已知该软盘容量为1474560字节。
- 文件占用的软盘空间都是按块分配的,每个块大小为512个字节。
- 一个块只能被一个文件使用。
- 拷贝到软盘中的文件必须是完整的,且不能采取任何压缩技术。
输入描述
第1行为一个整数N,表示计算机中的文件数量。1 ≤ N ≤ 1000.
接下来的第2行到第N+1行(共N行),每行为一个整数,表示每个文件的大小Si,单位为字节。
0 ≤ i < N,0 ≤ Si
输出描述
科学家最多能拷贝的文件总大小
备注
为了充分利用软盘空间,将每个文件在软盘上占用的块记录到本子上。即真正占用软盘空间的只有文件内容本身。
3
737270
737272
737288
1474542
6
400000
200000
200000
200000
400000
400000
1400000
解题思路:
本质上是一个 01背包问题,每个文件都可以选择拷入或者不拷入,在不超过最大值情况下保证拷入的文件大小最大。不熟悉 01 背包的可以在基础版之上多写几遍记住模板。
不过此题多了一个按块分配的限制,最大值 以及 循环条件需要按 /512 来限制。
代码实现:
n = int(input())
arr = []
max_s = int(1474560/512)
for i in range(n):arr.append(int(input()))
dp = [0]*(max_s+1)
for i in range(n):t = arr[i]if t%512 != 0:t += 512t = int(t/512)#整数部分for j in range(max_s,t-1,-1):dp[j] = max(dp[j],dp[j-t]+arr[i])#选或者不选
print(dp[max_s])