๋งค์ฐ ๋งค์ฐ ๋งค์ฐ ๋งค์ฐ ์ด๋ ค์ด ๋ฌธ์ ์์ต๋๋ค. ์ ํํ ๋.
๋ฌธ์ ์ ๋ชฉ์ด ๋งค์ฐ ์ญ์ค์ ์ผ๋ก ์๊ดด๊ฐ ๋๋ผ๊ฒ ํ๊ณ ใ ใ ใ ๋๊ฐ ์ด๊ฒ ๋ํผ์ ์ ํ์ ์ธ ๋ฌธ์ ๋ผ๊ณ ํด์ ๋ ์๊ดด๊ฐ์ ๋๊ผ์ต๋๋ค.
ํ์ง๋ง, ์๊ดด๊ฐ์ ๋๋ผ๋ ๊ฒ๋ ์ด์ ์ต์ํด์, ์ ํญ์ด ์๊ฒจ๊ฐ๋ค์.
๋ง์ ์๊ฐ์ ๋ค์ฌ์, ๊ฒฐ๊ตญ ์ดํด๋ฅผ ํ๊ณ ์ฌ๋ฌ๋ถ์๊ฒ ์ ๋ฌ๋๋ฆฝ๋๋ค.
< ์ฝ๋ฆฐ์ด๋ฅผ ์ํ ์ฝ๊ฒ ์ค๋ช ํ ํต์ฌ ์์ด๋์ด >
1. ์ฐ์ ์ด๋ถ์ ์ค๋ช ์ ์ฝ๊ณ ์ ์ฃผ์ธ์ !! ์ ๋ง ์ค๋ช ์ ์ฐจ๊ทผ ์ฐจ๊ทผ ์ ํด์ฃผ์ จ๋๋ผ๊ตฌ์.
2. ์ ๋ 1๋ฒ ์๋ฃ์ ์กฐ๊ธ ๋ ์ง๊ด์ ์ธ ์ค๋ช ์ ๋ง๋ถ์ด๊ฒ ์ต๋๋ค.
๋ฐ์ ์ฝ๋๋ ์์ ๋์ค๋ ์์ด๋์ด๋ฅผ ์ฝ๋๋ก ํํํ ๊ฒ๋๋ค.
์กฐ๊ธ ์์ธํ ์ผ์ต๋๋ค.
#
n, k = map(int, input().split())
# ์์ดํ
์ ์ธ๋ฑ์ค - (๋ฌด๊ฒ, ๊ฐ์น) ํํ ์ฌ์
dic = {}
for i in range(n) :
w, v = map( int, input().split() )
dic[i] = (w, v)
print(dic)
# {0: (6, 13), 1: (4, 8), 2: (3, 6), 3: (5, 12)}
# ์นผ๋ผ์ ๊ฒฝ์ฐ ๋ฌดํจ์นธ์ ๋งจ ์์ ์ฝ์
ํ์ฌ, ์นผ๋ผ ๊ฐ์ด ์ค์ ๋ฌด๊ฒ์ ๊ฐ์ด ํ์ฑ๋๊ฒ ๋ง๋ฌ
lst = [ [0] * (k+1) for _ in range(n) ]
# lst
# [0, 0, 0, 0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0, 0, 0, 0]
# dynamic programming ์ ์ํด, ์ฒซ ๋ฒ์งธ ํ ์ค์
firstTuple = dic[0]
firstW, firstV = firstTuple
# ์ฒซ๋ฒ์งธ ์นผ๋ผ 1 ~ ๋ฌด๊ฒ ํ๋๊น์ง ๊ฐ ์ด๊ธฐํ
for i in range(1, k+1) :
if firstW <= i :
lst[0][i] = firstV
else :
lst[0][i] = 0
# lst
# [0, 0, 0, 0, 0, 0, 13, 13]
# [0, 0, 0, 0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0, 0, 0, 0]
# [0, 0, 0, 0, 0, 0, 0, 0]
# dynamic programming ์ค์
# ์ด๋ฒ ํญ๋ชฉ์ ํฌํจํ ์ ์๋ค๋ฉด, ์ด์ ํญ๋ชฉ์ ํฌํจํ ๊ฒ ๊น์ง์ ์ต๋๊ฐ ์ทจํ๊ธฐ
# ์ด๋ฒ ํญ๋ชฉ์ ํฌํจํ ์ ์๋ค๋ฉด
# 1. ํ ์ ์์ด๋ ํ์ง ์์ ๊ฒฝ์ฐ
# 2. ํฌํจํ๊ณ , ์ ํด์ง ๋ฌด๊ฒํ๋๋ก๋ถํฐ, ์ด๋ฒ ํญ๋ชฉ์ ๋ฌด๊ฒ๋ฅผ ์ ์ธํ๊ณ , ์ด์ ํญ๋ชฉ๊น์ง์ ํด๋น ๋ฌด๊ฒ ์์ ์ต๋๊ฐ
# : value + lst[r-1][c-weight]
for r in range(1,n) :
weight, value = dic[r]
for c in range(1,k+1):
if weight <= c :
lst[r][c] = max(
lst[r-1][c],
value + lst[r-1][c-weight]
)
else :
lst[r][c] = lst[r-1][c]
# lst
#[[0, 0, 0, 0, 0, 0, 13, 13],
#[0, 0, 0, 0, 8, 8, 13, 13],
#[0, 0, 0, 6, 8, 8, 13, 14],
#[0, 0, 0, 6, 8, 12, 13, 14]]
# dp array์ ๋ง์ง๋ง ์ํธ๋ฆฌ ํ๋ฆฐํธ
print( lst[-1][-1] )