ํ๋์ ๋ฌธ์ ๋ฅผ ๋จ ํ ๋ฒ๋ง ํ๋๋ก ํ๋ ์๊ณ ๋ฆฌ์ฆ
#sub-solution #list #memoization
๐๐ป ํฌ๊ณ ์ด๋ ค์ด ๋ฌธ์ ๊ฐ ์์ผ๋ฉด ๊ทธ๊ฒ์ ๋จผ์ ์๊ฒ ๋๋์ด์ ํด๊ฒฐํ ๋ค์ ์ฒ๋ฆฌํ์ฌ ๋์ค์ ์ ์ฒด์ ๋ต์ ๊ตฌํ๋ ๋ฌธ์ .
๋ฉ๋ชจ์์ด์ ์ด์
(Memoization)์ด ์ฌ์ฉ๋จ(๋ถํ ์ ๋ณต๊ณผ ๋ค๋ฅธ ์ด์ ).
์ด๋ฏธ ๊ณ์ฐํ ๊ฒฐ๊ณผ๋ ๋ฐฐ์ด์ ์ ์ฅํจ์ผ๋ก์จ ๋์ค์ ๋์ผํ ๊ณ์ฐํ ๋ ๋จ์ํ ๊ฐ์ ๋ฐํํ๊ธฐ๋ง ํ๋ฉด ๋๋ ์๋ฆฌ.
limit๊ฐ๊ณผ ๋ฌด์์ ๊ตฌํ๊ณ ์ํ๋ ๋ฌธ์ ์ธ์ง ํ์
ํ๋ ๊ฒ์ด ๊ด๊ฑด์ธ DP๋ฌธ์ ์ด๋ค.
"์ต๋ K๋งํผ์ ๋ฌด๊ฒ๋ง์ ๋ฃ์ ์ ์๋ ๋ฐฐ๋ญ"์์ "๋ฌผ๊ฑด๋ค์ ๊ฐ์น์ ์ต๋๊ฐ"์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ฏ๋ก ๊ฐ์น(V)๊ฐ์ ์ด์ ์ ๋๊ณ ํด๊ฒฐํ์.
์๋ ํ๋ฅผ ์ดํดํ๋ฉด DP๋ก ์ฝ๊ฒ ๊ตฌํํ ์ ์๋ค.
๊ฐ ์
์ ๊ฐ ํ ์ด์ ์ ๋ฌด๊ฒ(W)์ ๊ฐ์น(V)๋ง ์๊ณ ์๋ค๊ณ ๊ฐ์ ํ์ ๋์ ์ต๋ ๊ฐ์น์ ํฉ์ด๋ค.
bag=[[W1,V1],[W2,V2], ...]๋ก ๊ฐ์ ํด๋ณด์.
[4,8]ํ์์ K=7์ผ ๋ [4,8]์ ๋ด๋ ๊ฒ๋ณด๋ค [6,13]์ ๋ด๋ ๊ฒ์ด ๊ฐ์น๊ฐ ์ปค์ V=13์ด๋ผ๊ณ ํ๋ค.
๊ทธ๋ฌ๋ [3,6]ํ์์๋ K=7์ผ ๋, [6,13]์ ๋ด๋ ๊ฒ๋ณด๋ค [4,8]๊ณผ [3,6] ๋๊ฐ๋ฅผ ๋ด๋ ๊ฒ์ด ๊ฐ์น๊ฐ ์ปค์ V=14์ด๋ค.
์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์,
[4,8]ํ์ K=7์ผ ๋ ๊ฐ์ด "13"์ธ๋ฐ (๋
ธ๋์์),
[4,8]ํ์์ K=7์ธ ๊ฐ(13)๋ณด๋ค K=7-3์ผ ๋์ V(8) + [3,6]๋ฌผ๊ฑด์ V(6)์ธ ๊ฐ์ด ๋ ํฌ๊ธฐ๋๋ฌธ์ V=14๋ผ๋ ๊ฒ์ด๋ค. (๋นจ๊ฐ์์์ ํฉ)
์ด ๊ธฐ์ค์ด ๋ง์กฑํ์ง ์์ผ๋ฉด DP[i][j] = DP[i-1][j]
์ธ ๊ฒ์ ํ์ธํ ์ ์๋ค!
DP[i][j] = max(DP[i-1][j], DP[i-1][bag[i-1][0]]+bag[i][1])
#ํ์ ์ ์
๊ณผ ํ์ฌ๋ฌผ๊ฑด์V+์ด์ ๋ฌผ๊ฑด์V๊ฐ์ ์ต๋๊ฐ์ด ๋ฐ๋ก DP๊ฐ์
์ฝ๋๋ฅผ ๋ณด๋ฉด์ ๋ค์ ์ดํด๋ณด์.
import sys
input = sys.stdin.readline
N, K = map(int, input().split())
bag = [list(map(int, input().split())) for _ in range(N)]
dp = [[0]*(K+1) for _ in range(N+1)]
#DPํ๋ 0~K+1, 0~N+1๋ก ๊ตฌ์ฑํ์ (N=1์ผ ๋, DP[i-1][j]๊ฐ ์กด์ฌํด์ผ ํ๋ฏ๋ก)
for i in range(1,N+1):
for j in range(1,K+1):
if j >= bag[i-1][0]: #"ํ์ฌ์ต๋๋ฌด๊ฒj๊ฐ ํด๋น๋ฌผ๊ฑด๋ฌด๊ฒ๋ณด๋ค ํฐ ๊ฒฝ์ฐ
#ํ์ ์ ์
์ ๊ฐ๊ณผ ํ์ฌ๋ฌผ๊ฑด์V+์ด์ ๋ฌผ๊ฑด์V๊ฐ์ ์ต๋๊ฐ์ DP[i][j]์ ์ ์ฅ
dp[i][j] = max(bag[i-1][1]+dp[i-1][j-bag[i-1][0]],dp[i-1][j])
else:
#"ํ์ฌ์ต๋๋ฌด๊ฒj๊ฐ ํด๋น๋ฌผ๊ฑด๋ฌด๊ฒ๋ณด๋ค ์์ ๊ฒฝ์ฐ (ํ์ฌ ๋ฌผ๊ฑด์ ๋ด์ ์ ์๋ ๊ฒฝ์ฐ)
dp[i][j] = dp[i-1][j]
print(dp[N][K]) #DP[N][K]๊ฐ ๋ฌด์กฐ๊ฑด ์ ๋ต
์์์ ๋์์๋ฆฌ ์ค๋ช ์ ๋ค ํ์ผ๋ฏ๋ก ๋ช ๊ฐ์ง ์ฒดํฌ์ฌํญ์ ๋ํด์๋ง ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
DP[i][j] = DP[i-1][j]
์ ๋ฐ๋ฅธ๋ค.ex) [4,8]์ธ๋ฐ j๊ฐ 3์ธ ๊ฒฝ์ฐ
์ต๋๋ฌด๊ฒ๊ฐ 3์ด๋ฉด, ๋ฌด๊ฒ๊ฐ 4์ธ ๋ฌผ๊ฑด์ ๋ด์ ์ ์๋ค!