题目
略
注意点
- 不要想着有什么特殊的,就是背包问题,一定有v和w两个变量。隐含了价值。
- 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])