提出詳細
ソースコード
t = int(input())
ans_w = []
ans_v = []
for loop in range(t):
max_num = int(input())
max_weight = int(input())
weight, value = [], []
for i in range(max_num):
a, b = map(int, input().split())
weight.append(a), value.append(b)
dp = [[[0, 0] for j in range(max_weight + 1)]for i in range(max_num + 1)] # [何個目][重み(値段)][価値(重さ)、その価値の時の最大の重み(値段)]
for num in range(max_num):
for wei in range(max_weight + 1):
if wei >= weight[num]:
if dp[num][wei - weight[num]][0] + value[num] == dp[num][wei][0]:
if dp[num][wei - weight[num]][1] + weight[num] >= dp[num][wei][1]:
dp[num + 1][wei][0] = dp[num][wei - weight[num]][0] + value[num]
dp[num + 1][wei][1] = dp[num][wei - weight[num]][1] + weight[num]
else:
dp[num + 1][wei] = dp[num][wei]
elif dp[num][wei - weight[num]][0] + value[num] > dp[num][wei][0]:
dp[num + 1][wei][0] = dp[num][wei - weight[num]][0] + value[num]
dp[num + 1][wei][1] = dp[num][wei - weight[num]][1] + weight[num]
else:
dp[num + 1][wei] = dp[num][wei]
else:
dp[num + 1][wei] = dp[num][wei]
ans_v.append(dp[max_num][max_weight][0])
ans_w.append(dp[max_num][max_weight][1])
for loop in range(t):
print("Case #{}:".format(loop + 1))
print(ans_w[loop], ans_v[loop])
提出情報
提出出力結果
テストケース情報