๋ฐฑ์ค 12865 ํ์ด์ฌ
https://www.acmicpc.net/problem/12865
์ด๋ฒ ๋ฌธ์ ๋ ๊ฐ๋ฐฉ์ ๋ค์ด๊ฐ ์ ์๋ ์ต๋ ๋ฌด๊ฒ๊ฐ ์ ํด์ ธ ์์ ๋ ๋ฃ์ ์ ์๋ ๋ฌผ๊ฑด์ ์ต๋ ๊ฐ์น๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค. ์ผ๋จ ์ต๋๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ฅ ๋จผ์ ๋์ ๊ณํ๋ฒ์ด ๋ ์ฌ๋์ต๋๋ค. ๋ฉ๋ชจ์ด์ ์ด์ ์ผ๋ก ์ฌ์ฉํ ๊ฐ์ ๊ฐ๋ฐฉ์ ๋ค์ด๊ฐ๋ ๋ฌด๊ฒ๋ฅผ ์ค์ ์ผ๋ก ๋๊ณ ๋ฌผ๊ฑด์ ํ์ธํ ๋ ๊ฐ๋ฐฉ์ ์ต๋ ๋ฌด๊ฒ๋ถํฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๊น์ง ๋์ ์ํค๋ ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ๋จผ์ ๋ ์ฌ๋๋ค.
Python ํ์ด 1
import sys
read = sys.stdin.readline
N, K = map(int, read().split())
cache = [0] * (K+1)
for _ in range(N):
w, v = map(int, read().split())
for j in range(K, w-1, -1):
cache[j] = max(cache[j], cache[j-w] + v)
print(cache[-1])
๊ฐ๋ฐฉ ๋ฌด๊ฒ์ ์ต๋ ๊ฐ K ๋ถํฐ ์ญ์์ผ๋ก ๋ค์ด๊ฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ w๊น์ง ์ํํ๋ฉด์ ํด๋น ์์น์ ์ต๋ ๊ฐ์น(cache[j])์ ๋ค์ด๊ฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ w ๋งํผ ์ด์ ์ ์ต๋ ๊ฐ์น(cache[j-w])์ ๋ฌผ๊ฑด์ ๊ฐ์น v๋ฅผ ๋ํ ๊ฐ ์ค ์ต๋๊ฐ์ ๊ตฌํ๋ค.
4๊ฐ์ง ๋ฌผ๊ฑด์ ์์ฐจ์ ์ผ๋ก ๋ฃ๋๋ค๊ณ ํ์ ๋ ์บ์๊ฐ์ ํ๋ฆ์ ์์ ๊ฐ์ด ์งํ๋๋ค. ๊ฐ๋ฐฉ์ ๋ฌผ๊ฑด์ ๋ฃ๋๊ฑฐ๋๊น... ๋ฌผ๊ฑด์ด ๋ค์ด๊ฐ ์ํ์ ๋ฌด๊ฒ๊ฐ ๋์ ๋๋ค๊ณ ์๊ฐํ๋ฉด ์ฝ๊ฒ ์ดํดํ ์ ์๋ค.
ํ์ง๋ง ์ ๋ฐฉ๋ฒ์ ๋ฌผ๊ฑด์ ์์ ์๊ด์์ด ์ต๋ ๋ฌด๊ฒ K์์ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๊น์ง ๋งค๋ฒ ์ํํ๊ธฐ ๋๋ฌธ์ ๊ผญ ํ์ํ์ง ์๋ ์๊ฐ๋ณต์ก๋๊ฐ ์๊ธด๋ค. ๋ง์ฝ ๋ฌผ๊ฑด๋ค ๋ฌด๊ฒ ํฉ์ ๊ฒฝ์ฐ์ ์๋ง ์ํํ๋ค๊ณ ํ๋ฉด ํจ์ฌ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ ๋ฆฌ์คํธ๋ณด๋ค๋ ๋์ ๋๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
Python ํ์ด 2
์ด ํ์ด๋ ๊ฐ๋ฐฉ ์์ ๋ค์ด๊ฐ๋ ๋ฌผ๊ฑด๋ค ๋ฌด๊ฒ ํฉ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋์ ๋๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค.
import sys
read = sys.stdin.readline
N, K = map(int, read().split())
cache = {0: 0}
for _ in range(N):
curr_w, curr_v = map(int, read().split())
temp = {}
for w, v in cache.items():
if curr_w + w <= K and curr_v + v > cache.get(curr_w + w, 0):
temp[curr_w + w] = curr_v + v
cache.update(temp)
print(max(cache.values()))
๋์ ๋๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ ํ๊ฐ์ง ์ฃผ์ํด์ผํ ๊ฒ์ด ์์ต๋๋ค. ๋์ ๋๋ฆฌ๋ฅผ ์ํํ ๋ ๋์ ๋๋ฆฌ๋ฅผ ์์ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ๊ทธ๋์ ์์๋ก ์ฌ์ฉํ ๋์ ๋๋ฆฌ๋ฅผ ๋ง๋ค์ด์ฃผ๊ณ update ํจ์๋ฅผ ์ด์ฉํด์ ๋์ ๋๋ฆฌ๋ฅผ ์ต์ ํ ํด์ฃผ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํด์ผํฉ๋๋ค.
ํ์ด 1๊ณผ ์ ์ฌํ์ง๋ง ๋ฉ๋ชจ์ด์ ์ด์ ์บ์๋ก ๋์ ๋๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ํ์ฌ์ ๋ฌผ๊ฑด ๋ฌด๊ฒ(curr_w)์ ๊ฐ๋ฐฉ ์์ ๋ฌผ๊ฑด๋ค ๋ฌด๊ฒ ํฉ(w)์ด ์ต๋ ๊ฐ K๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๊ณ ํด๋น ๋ฌด๊ฒ ํฉ(curr_w + w)์ ๊ฐ์น๊ฐ ํ์ฌ ๋ฌผ๊ฑด ๊ฐ์น(curr_v) + ๊ฐ๋ฐฉ ์์ ๋ฌผ๊ฑด๋ค ํฉ์ ๊ฐ์น(v) ์ ์ ๊ฒฝ์ฐ์ ์์๋ก ๋ง๋ ๋์ ๋๋ฆฌ์ ํฌํจ ์ํจ๋ค. ๋ง์ฝ ํด๋น ๋ฌผ๊ฑด ํฉ์ ๊ฒฝ์ฐ๊ฐ ์๋ ๊ฒฝ์ฐ 0๊ณผ ๋ํด์ ํด๋น ๋ฌผ๊ฑด๋ง ๋ค์ด๊ฐ ์ ์๋๋ก ํ๊ณ ์ต์ข ์ ์ผ๋ก ๋ค ์ํํ๋ฉด cache ๊ฐ์ update ํฉ๋๋ค.
์ต์ข ์ ์ผ๋ก ์ถ๋ ฅํ๋ ๊ฐ์ cache์ ๋ค์ด ์๋ ๊ฐ ์ค ์ต๋๊ฐ ์ ๋๋ค.
๋๊ธ