우리가 찾고자 하는 최적해를 로 나타낼 수 있는데 와 는 각각 짜리 사탕을 몇개 담는지를 나타냅니다.
그런데 개를 집을거라면 당연히 짜리 사탕에서 가장 당도가 높은 사탕 개를 집는것이 이득입니다. 도 마찬가지입니다.
주어진 수열을 정렬하고 짜리 사탕을 집을수 있는 경우의 수를 모두 시도하면 짜리 사탕을 몇개 집을지는 자동으로 정해집니다. 따라서 으로 해결 가능합니다.
import sys
input = sys.stdin.readline
N, W = map(int, input().split())
# 정렬할 때 맨 앞에 0이 있게 하도록 추가함
S3 = [1000000000]; S5 = [1000000000]
for i in range(N):
t, s = map(int ,input().split())
if t == 3 : S3.append(s)
else : S5.append(s)
S3.sort(reverse = True); S5.sort(reverse = True);
S3[0] = S5[0] = 0
# 누적합 배열을 만든다 S3[i] = 3 사탕을 i개 골랐을 때 당도 합
for i in range(1, len(S3)) : S3[i] += S3[i - 1]
for i in range(1, len(S5)) : S5[i] += S5[i - 1]
ret = 0
for i in range(min(len(S3) - 1, W // 3) + 1):
ret = max(ret, S3[i] + S5[min(len(S5) - 1, (W - 3 * i) // 5)])
print(ret)