【刷题】拷贝文件

68 阅读1分钟

题目

注意点

  1. 不要想着有什么特殊的,就是背包问题,一定有v和w两个变量。隐含了价值。
  2. math.ceil可以实现int相反的效果
import math
import sys
"""
3
737270
737272
737288
"""
# dp[i][j]表示在仅使用到第i种光盘的时候,且个数不超过j的,最大的数量
# 这个就是完完全全的背包问题
num_total = int(1474560/512)
print(num_total)
sizes = []
values = []
num_line = int(sys.stdin.readline())
for i in range(num_line):
    value = int(sys.stdin.readline())
    sizes.append(math.ceil(value / 512))
    values.append(value)
dp = [[0] * (num_total + 1) for i in range(num_line)]
# 第一行
for j in range(1, num_total + 1):
    dp[0][j] = (j // sizes[0]) * values[0]

for i in range(1, num_line):
    for j in range(1, num_total + 1):
        """完全背包
        times = 0
        while j - times * sizes[i] >= 0:
            dp[i][j] = max(dp[i][j], dp[i - 1][j - times * sizes[i]] + values[i] * times)
            times += 1
        """
        # 01背包
        dp[i][j] = dp[i - 1][j]
        if j - sizes[i] >= 0:
            dp[i][j] = max(dp[i][j], dp[i-1][j - sizes[i]] + values[i])

for i in dp:
    print(i)

print(dp[-1][-1])