๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/12865
๐ ํ์ด ๋ฐฉ๋ฒ
์ด๋ ต๋ค... ์ญ์ ์์ง ๊ณจ๋๋ ๋ฌด๋ฆฌ์ธ๊ฐ ใ ใ ๊ทธ๋๋ '2์ฐจ์ dp๋ฅผ ์ด์ฉํด์ผ๋๋๊ตฌ๋!'๋ฅผ ๋์น์ฑ๊ธด ํ๋ค. ๋จ,, ์ด๋ป๊ฒ ์ด์ฉํ๋๋๋ฅผ ๋ชฐ๋์ง ใ ใ ์ธํฐ๋ท์ ์ฐพ์๋ณด๋๊น, ํด๋น ๋ฌธ์ ๋ ๊ต์ฅํ well-known ๋ฌธ์ ๋ผ๊ณ ํ๋ค. (ํ๊ต ์๊ณ ๋ฆฌ์ฆ ์์ ์์๋ ์์ฃผ ๋ฑ์ฅํ๋ ์์ฃผ ๋จ๊ณจ์ด๋ผ๋?! (๋ ๋น์ ๊ณต์ ใ ใ ))
๊ทธ๋์ ์ผ๋จ dp๋ฅผ ์ด๋ป๊ฒ ๋ง๋ค์ด์ผํ๋์ง ์ฒ์ฌ๋ค์ด ํ์ด๋์ ํ์ด๋ฅผ ๋ณด๊ณ ์กฐ๊ธ ๊ฐ์ ์ก๊ณ , ๊ทธ๋ฆผ์ ๊ทธ๋ ค๊ฐ๋ฉด์ ํ์ด๋ณด์๋ค. (์ด๊ฒ ์ดํด๋ ๋๋๋ฐ ๋ง๋ก ์ค๋ช ์ด ์ด๋ ต๋๋ผ๊ตฌ์..?)
์ผ๋จ... ๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ฉด ์ด๋ ๊ฒ ๋๋ค.
์ฐจ๋ก๋๋ก 1ํ๋ถํฐ ํ์ผ๋ฉด์ ์งํ๋๋ค.
- DP ์์ ๊ฐ์ผ๋ก๋ ๋ฌธ์ ์์ ์ฃผ์ด์ง V ๊ฐ์ด ๋ค์ด๊ฐ ๊ฒ
- dp[i][j]์์ i๋ ๋ฐฐ๋ญ์ ๋ฃ์ ๋ฌผ๊ฑด ๋ฒํธ
- dp[i][j]์์ j๋ ํ์ฌ ๋ฐฐ๋ญ์ ๋ฌด๊ฒ → ์ฆ, j์ ์ต๋ ๊ฐ์ ์ฃผ์ด์ง K๊ฐ ๋๋ค.
์ฐ์ ์ด ๋ฌธ์ ์ ํต์ฌ์, ๋ฌผ๊ฑด์ ๊ณ์ํด์ ๋ํด๋ณด๋๋ฐ, ๋ฌด๊ฒ K๋ฅผ ๋์ผ๋ฉด ์๋๋ค๋ ์กฐ๊ฑด์ด ์๋ค. ์ด ์กฐ๊ฑด์ ์งํค๊ธฐ ์ํด์ ์ฐ๋ฆฌ๋ j ๊ฐ์ ์ฃผ๋ชฉํด์ผํ๋ค.
- [1][6] ์ ๋ณด์. 13์ด ๋ค์ด๊ฐ์๋ค.
- 1๋ฒ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๊ฐ 6์ด๊ธฐ ๋๋ฌธ์ j=6์ธ ๊ณณ์ 1๋ฒ๋ฌผ๊ฑด์ ๋ฃ์ ์ ์์๋ ๊ฒ์ด๋ค.
- ์ฌ์ค ์ด์ ๋จ๊ณ๋ถํฐ ์ดํด๋ณด๋ฉด, ์ง๊ธ ๋ฃ์๋ ค๋ 1๋ฒ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๊ฐ 6์ด๊ธฐ ๋๋ฌธ์, "j = 6(ํ์ฌ๊ฐ๋ฐฉ์๋ฌด๊ฒ) - 6(1๋ฒ๋ฌผ๊ฑด์๋ฌด๊ฒ) = 0" ๊ทธ๋๊น ๊ฐ๋ฐฉ๋ฌด๊ฒ๊ฐ 0์ธ ๊ฒฝ์ฐ์์ 1๋ฒ๋ฌผ๊ฑด์ ๋ฃ์ ์ ์๋ค. ๊ทธ๋์ ํด๋น ๊ฐ์ [1][0] + v[1] = 0 + 13 ๋ผ๊ณ ๋ณผ ์ ์๋ค.
- [1][7]์ ๋ณด์. ๊ทธ๋๋ก 13์ด ๋ค์ด๊ฐ์๋ค.
- ๋ง์ฐฌ๊ฐ์ง๋ก, 1๋ฒ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๊ฐ 6์ด๋ค. [1][7]์ ๋ง์ฝ 1๋ฒ๋ฌผ๊ฑด์ ๋ฃ์ผ๋ ค๊ณ ํ๋ค๋ฉด, [1][1] ์ผ๋ ๋ฃ์ ์ ์์ ๊ฒ์ด๋ค. ๊ทธ๋ผ ๊ฒฐ๊ตญ [1][1] + v[1] = 0 + 13 ์ด ๋์์ ๊ฒ์ด๋ค.
- [2][5]๋ฅผ ๋ณด์. 8์ด ๋ค์ด๊ฐ์๋ค.
- 2๋ฒ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๋ 4์ด๋ค. ํ์ฌ ๊ฐ๋ฐฉ๋ฌด๊ฒ๋ 5 ์ด๊ธฐ ๋๋ฌธ์ 1์ผ๋ 2๋ฒ๋ฌผ๊ฑด์ ๋ฃ์ ์ ์์์ ๊ฒ์ด๋ค. ๊ทธ๋ผ [2][1] + v[2] ๋ฅผ ๋ํ๊ธฐ ๋๋ฌธ์ 8์ด ๋์์ ๊ฒ์ด๋ค.
- [2][6]์ ๋ณด์. 13์ด ๋ค์ด๊ฐ์๋ค
- ์ฐ๋ฆฌ๊ฐ ์์์ ์งํํด์ค๋ค๊ฐ ๊ฐ๊ณผํ๊ฒ ์๋๋ฐ, ์ฐ๋ฆฌ๋ ์์๋๋ก ๋ํ๋๊ฒ ๋ฟ๋ง ์๋๋ผ, ์ด์ ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์๊ฐํด์ ์ต๋๊ฐ์ ์ฐพ์์ผํ๋ค.
- ์ผ๋จ, [2][6]์ ๋ฃ์ ๊ฐ์ [2][2] + v[2] ๊ฐ์ธ 8์ด ๋ ๊ฒ์ด๋ค. ๊ทผ๋ฐ ์ 13์ด ๋์๋๊ฐ?
- ์ด์ ๋, ์ฐ๋ฆฌ๋ [2][6]์ ๋ฌด๊ฒ 6์ ๋ง์ถฐ ๋ฃ์ ์ ์๋ค. ๊ทธ๋ผ, [1][6]๊ณผ๋ ๋น๊ตํด์ฃผ์ด์ผํ์ง ์๊ฒ ๋๊ฐ?? ์ฐ๋ฆฌ๋ ์ด์จ๋ ์ต๋๊ฐ์ ์ฐพ๊ณ ์์ด์, ๊ฐ๋ฐฉ ๋ฌด๊ฒ๊ฐ 6์ด ๋ง๋ค์ด์ง ๋, 1๋ฒ๋ฌผ๊ฑด์ ๋ฃ์์๋ ๊ทธ ๊ฐ์ด ์ต๋์ธ์ง, 2๋ฒ๋ฌผ๊ฑด์ ๋ฃ์์๋ ๊ทธ๊ฐ์ด ์ต๋์ธ์ง๋ ๊ณ ๋ คํด์ฃผ์ด์ผํ๋ค.
- ๊ทธ๋์ [1][6] vs. [2][2]+v[2] ๋๊ฐ์ ๊ฐ์ ๋น๊ตํด์ ๋ ํฐ ๊ฐ์ธ 13์ ๋ฃ์ด์ค ๊ฒ์ด๋ค.
์ด์ ๋ ์ดํด๋ณด์์ผ๋ฉด, ๋์ถฉ ์ ํ์์ด ๋ณด์ธ๋ค.
dp[i][j] = max(dp[i-1][j], dp[i][j-weight[i]]+v[i])
โ๏ธ ์ฌ๊ธฐ์ ์ ๊น,,, dp[i][j-weight[i]]+v[i] ์ด๊ฑฐ ์ธ๋ฐ, ์ ํต๊ณผ๊ฐ ์๋ผ? ์ dp[i-1]... ์ด๋ผ๊ณ ํด์ผํ์ง???? ์ง์ง ์ดํด์๋ผ.. (์ด๊ฒ๋ ์ธํฐ๋ท๋ณด๊ณ ๊ฒจ์ฐ ํด๊ฒฐํ๊ฑฐ์)
์๋ ์ ์ด๋์๊ฒ์ ์์๋๋ถ ๋๊ธ ๋ถํ๋๋ฆฌ๊ฒ ์ต๋๋ค.. ์ dp[i-1]์ธ๊ฐ????? ์. . ์คํฐ๋์๋คํํ ๋ฌผ์ด๋ด์ผ์ง... ๋ค๋ฅธ ํ์ด๋ค๋ ๋ค ๋ณด๋ฉด dp[i]๋ผ๊ณ ์จ๋๊ณ ์ฝ๋๋ dp[i-1] ์ด๋ผ๊ณ ํด๋ง๋ค ;; ใ ใ
๐ ์ ์ฒด์ฝ๋
let nk = readLine()!.split(separator: " ").map { Int(String($0))! }
let n = nk[0]
let k = nk[1]
var weigth = [Int]()
var value = [Int]()
weigth.append(0) // index 1๋ก ๋ง์ถฐ์ค๋ผ๊ณ 0 ๋ฃ์ด์ค
value.append(0)
for _ in 0..<n {
let temp = readLine()!.split(separator: " ").map { Int(String($0))! }
weigth.append(temp[0])
value.append(temp[1])
}
var dp = Array(repeating: Array(repeating: 0, count: k+1), count: n+1)
for i in 1..<n+1 {
for j in 1..<k+1 {
if i == 1 { // 1๋ฒ ๋ฌผ๊ฑด์ผ ๋๋ j๊ฐ 1๋ฒ๋ฌด๊ฒ๋ณด๋ค ํฌ๋ฉด ๊ทธ๋ฅ ๋ฐ๋ก ๋ฃ์ด์ค
if j >= weigth[i] {
dp[i][j] = value[i]
}
} else { // 2๋ฒ ๋ฌผ๊ฑด๋ถํฐ ๋น๊ตํ๋ฉด์ ์์
if weigth[i] > j {
dp[i][j] = dp[i-1][j]
} else {
dp[i][j] = max(dp[i-1][j], dp[i-1][j-weigth[i]]+value[i])
// โ ๏ธ dp[i][j] = max(dp[i-1][j], dp[i][j-weigth[i]]+value[i]) ์ด๊ฑฐ ์ ์๋์ผ?
}
}
}
}
print(dp[n][k])