Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 12865๋ฒˆ - ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ (dp, 2์ฐจ์› dp, Knapsack ์•Œ๊ณ ๋ฆฌ์ฆ˜)

๊ฐ์ž ๐Ÿฅ” 2022. 7. 19. 01:55
๋ฐ˜์‘ํ˜•

 

๐ŸŸ  ๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/12865

 

12865๋ฒˆ: ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ

์ฒซ ์ค„์— ๋ฌผํ’ˆ์˜ ์ˆ˜ N(1 ≤ N ≤ 100)๊ณผ ์ค€์„œ๊ฐ€ ๋ฒ„ํ‹ธ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ K(1 ≤ K ≤ 100,000)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘ ๋ฒˆ์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ฑฐ์ณ ๊ฐ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ W(1 ≤ W ≤ 100,000)์™€ ํ•ด๋‹น ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜ V(0 ≤ V ≤ 1,000)

www.acmicpc.net

 

๐ŸŸ  ํ’€์ด ๋ฐฉ๋ฒ•

์–ด๋ ต๋‹ค... ์—ญ์‹œ ์•„์ง ๊ณจ๋“œ๋Š” ๋ฌด๋ฆฌ์ธ๊ฐ€ ใ… ใ…   ๊ทธ๋ž˜๋„ '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] ์ด๋ผ๊ณ  ํ•ด๋†ง๋„ค ;; ใ… ใ…  

 

๐ŸŸ  ์ „์ฒด์ฝ”๋“œ

https://github.com/deslog/Algorithm/blob/main/Algorithm/Boj/12865_%ED%8F%89%EB%B2%94%ED%95%9C%20%EB%B0%B0%EB%82%AD/main.swift

 

GitHub - deslog/Algorithm

Contribute to deslog/Algorithm development by creating an account on GitHub.

github.com

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])
๋ฐ˜์‘ํ˜•