๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

Knapsack Problem

Knapsack Problem, ๋ฐฐ๋‚ญ๋ฌธ์ œ๋Š” ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๋งค์šฐ ์œ ๋ช…ํ•œ ๋ฌธ์ œ์ด๋‹ค.
์–ด๋–ค ๋ฐฐ๋‚ญ์ด ์žˆ๊ณ  ๊ทธ ๋ฐฐ๋‚ญ์•ˆ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฌด๊ฒŒ๊ฐ€ K๋ผ๊ณ  ํ•˜์ž. ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” N๊ฐœ์˜ ๋ฌผ๊ฑด์ด ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๊ฐ€์น˜ V๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ  ๊ฐ ๋ฌผ๊ฑด๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ฌด๊ฒŒ W๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์„ ๋•Œ, ๋ฐฐ๋‚ญ์ด ์ตœ๋Œ€ํ•œ ๊ฐ€์น˜๊ฐ€ ๋†’์€ ๋ฌผ๊ฑด๋“ค์„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ์กฐํ•ฉ์„ ์ฐพ๋Š” ๋ฌธ์ œ์ด๋‹ค. ๋ƒ…์ƒ‰ ๋ฌธ์ œ๋Š” Fractional Knapsack, ์ฆ‰ ๋ฌผ๊ฑด์„ ์ชผ๊ฐค ์ˆ˜ ์žˆ์–ด ๋ฌด๊ฒŒ๋‚˜ ๊ฐ€์น˜๊ฐ€ ์†Œ์ˆ˜์  ๋‹จ์œ„๋กœ ๋‚˜๋‰˜๋Š” ๋ฌธ์ œ, ๋˜๋Š” 0-1 Knapsack ๋ฌผ๊ฑด์„ ์ชผ๊ฐค ์ˆ˜ ์—†์–ด ๋ฌด๊ฒŒ์™€ ๊ฐ€์น˜๊ฐ€ ๋ฌด์กฐ๊ฑด ์ •์ˆ˜ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๋Š” ๋‘ ์œ ํ˜•์œผ๋กœ ๋‚˜๋‰œ๋‹ค. ์ด๋ฒˆ์—๋Š” 0-1 Knapsack ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ ์ƒ๊ฐํ•ด๋ณด์ž.

Brute Force Approach

๋งŒ์•ฝ n๊ฐœ์˜ ๋ฌผ๊ฑด์ด ์žˆ์„ ๋•Œ, ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ๋Š” 2n ๊ฐœ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋ชจ๋‘ ์‹œ๋„ํ•ด ๋ณด์•„์•ผํ•œ๋‹ค. ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฌผ๊ฑด์ด ๋ช‡๊ฐœ ์—†๋‹ค๋ฉด ๋ณ„๋กœ ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ์ง€๋Š” ์•Š๊ฒ ์ง€๋งŒ, 2n ์€ ๋ฌผ๊ฑด์˜ ๊ฐฏ์ˆ˜๊ฐ€ ํ•˜๋‚˜๋งŒ ๋Š˜์–ด๋„ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ํฌ๊ฒŒ ๋Š˜์–ด๋‚˜๊ฒŒ ๋œ๋‹ค. ์ด ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๐›ฉ(2n ) ์˜ ์‹œ๊ฐ„์„ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ณ , ํ”„๋กœ๊ทธ๋ž˜๋จธ ์ž…์žฅ์—์„œ ๊ทธ๋‹ค์ง€ ์ข‹์€ ์ ‘๊ทผ์€ ์•„๋‹ ๊ฒƒ์ด๋‹ค.

Dynamic Programming

๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ๋Š” ๋‹น์—ฐ์Šค๋Ÿฝ๊ฒŒ๋„ ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์œผ๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ•ญ์ƒ ๊ทธ๋ ‡๋“ฏ DP ์˜ ๊ฐ€์žฅ ํฐ ์–ด๋ ค์›€์€ subproblem ์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‚˜๋„ ๊ทธ๋žฌ๊ณ  ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์ด ๋ฌธ์ œ์˜ subproblem ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ–ˆ์„ ๊ฒƒ์ด๋‹ค.

Finding Subproblem - 1

  • ๋ฌด๊ฒŒ 7์˜ ๊ฐ€๋ฐฉ์„ ์ตœ๋Œ€ ๊ฐ€์น˜๋กœ ๊ฐ€๋“ ์ฑ„์šฐ๋ ค๋ฉด ๋ฌด๊ฒŒ 6์ผ๋•Œ ์ตœ๋Œ€ ๊ฐ€์น˜๋กœ ๊ฐ€๋“ ์ฑ„์› ์„ ๋•Œ์˜ ์กฐํ•ฉ์— ํ•˜๋‚˜๊ฐ€ ๋” ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?

์ด ์ˆ˜์—…์„ ๋“ฃ๊ธฐ์ „์— ๋‚˜๋„ ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ–ˆ๊ณ  ์ด ์ ‘๊ทผ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด๋ ค๊ณ  ๋ช‡์‹œ๊ฐ„์„ ๊ณ ๋ฏผํ–ˆ๋˜ ์ ๋„ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์ ‘๊ทผ์€ subproblem์„ ๋งŒ๋“ค์–ด๋‚ด์ง€ ๋ชปํ•œ๋‹ค. ๊ธฐ์กด์— ์žˆ๋˜ ์กฐํ•ฉ์—์„œ ํ•˜๋‚˜์˜ ๋ฌผ๊ฑด์„ ๋นผ๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์œผ๋กœ ์ตœ๋Œ€๊ฐ€์น˜๋ฅผ ๋งŒ๋“ค์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌด๊ฒŒ 4์ผ ๋•Œ์˜ ์กฐํ•ฉ๊ณผ ๋ฌด๊ฒŒ 5์ผ๋•Œ์˜ ์กฐํ•ฉ์ด ๋‹ฌ๋ผ์งˆ ์—ฌ์ง€๊ฐ€ ์ถฉ๋ถ„ํžˆ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

Finding Subproblem - 2

์œ„ ์ ‘๊ทผ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•ด์•ผ ํ• ๊นŒ. ๋ฐฐ๋‚ญ์— ๋ฌผ๊ฑด์„ ๋„ฃ์„ ๋•Œ, ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  1. ๋ฌผ๊ฑด์„ ๋„ฃ๋Š”๋‹ค.
  2. ๋ฌผ๊ฑด์„ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.

๋งŒ์•ฝ ํ˜„์žฌ ๋‚ด๊ฐ€ ๋„ฃ์œผ๋ ค๊ณ  ํ•˜๋Š” ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ๊ฐ€ ์ „์ฒด ์ œํ•œ๋ฌด๊ฒŒ๋ฅผ ์ดˆ๊ณผํ•œ๋‹ค๋ฉด, ์„ ํƒ์ง€๋Š” ๋ฌผ๊ฑด์„ ๋„ฃ์ง€ ์•Š๋Š” ๊ฒƒ ๋ฐ–์— ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹์„ ์ผ๋‹จ ํ•˜๋‚˜ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

B[k][W] = B[k-1][W], if wk > W

 

B๋Š” DP๋ฅผ ์œ„ํ•œ ์ตœ๋Œ€๊ฐ€์น˜๋ฅผ ๋‹ด๋Š” ๋ฐฐ์—ด์ด๊ณ , k๋Š” ํ˜„์žฌ ๋„ฃ์€ ๋ฌผ๊ฑด์˜ ๋ฒˆํ˜ธ, W์€ ์ตœ๋Œ€ ๋ฌด๊ฒŒ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. wk ๋Š” k๋ฒˆ์งธ ๋ฌผ๊ฑด์— ๋Œ€ํ•œ ๋ฌด๊ฒŒ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์œ„ ์‹์€ k๋ฒˆ์งธ ๋ฌผ๊ฑด์ด ์ด ์ œํ•œ ๋ฌด๊ฒŒ๋ฅผ ์ดˆ๊ณผํ•œ๋‹ค๋ฉด k๋ฒˆ์งธ ์ตœ๋Œ€๊ฐ€์น˜๋ฅผ ๋ฐ”๋กœ k-1๋ฒˆ์งธ ๋ฌผ๊ฑด์„ ๋„ฃ์„ ๊ฒฝ์šฐ์˜ ๊ฐ€์น˜๋กœ ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋งŒ์•ฝ ๋ฌผ๊ฑด์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌด๊ฒŒ๊ฐ€ ์กฐ๊ธˆ์ด๋ผ๋„ ๋‚จ์•˜๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ์ด๋•Œ ์šฐ๋ฆฌ์˜ ์„ ํƒ์ง€๋Š” ๋‹ค์‹œ ๋‘ ๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค.

  1. ์ƒˆ๋กœ์šด ๋ฌผ๊ฑด์„ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค
  2. ์ƒˆ๋กœ์šด ๋ฌผ๊ฑด์„ ๋„ฃ๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋„ฃ์„ ๊ณต๊ฐ„์„ ๋งŒ๋“ค์–ด์„œ ๋ฌผ๊ฑด์„ ๋„ฃ๋Š”๋‹ค.

์šฐ๋ฆฌ๋Š” ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋‘ ๊ฒฝ์šฐ ์ค‘ ๋” ํฐ ๊ฐ’์„ ์„ ํƒํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์„ ์ˆ˜์‹์œผ๋กœ ๋งŒ๋“ค๋ฉด,

B[k][W] = max(B[k-1][W], B[k][W-wk] + val(wk))

 

ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋„ฃ๊ธฐ ์œ„ํ•ด ๋„ฃ์—ˆ๋˜ ๋ฌผ๊ฑด์„ ๋บ์„ ๋•Œ์˜ ๊ฐ€์น˜์— ํ˜„์žฌ ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜๋ฅผ ๋”ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

ํ‘œ๋ฅผ ์ฑ„์›Œ๊ฐ€๋ฉด์„œ ๋” ์ž์„ธํ•˜๊ฒŒ ์ƒ๊ฐํ•ด๋ณด์ž. ์šฐ๋ฆฌ์—๊ฒŒ ๋„ค ๊ฐœ์˜ ๋ฌผ๊ฑด์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž ๋ฌผ๊ฑด์€ (๋ฌด๊ฒŒ, ๊ฐ€์น˜) ๋กœ ๋‚˜ํƒ€๋‚ด๊ฒ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๊ฑด์„ ๋„ฃ์„ ๊ฐ€๋ฐฉ์˜ ์ตœ๋Œ€ ๋ฌด๊ฒŒ๋Š” 5๋ผ๊ณ  ํ•˜์ž.

๋ฌผ๊ฑด : (2, 3), (3, 4), (4, 5), (5, 6)
๊ฐ€๋ฐฉ์˜ ์ตœ๋Œ€ ๋ฌด๊ฒŒ: 5

 

  0 1 (2, 3) 2 (3, 4) 3 (4, 5) 4 (5, 6)
0          
1          
2          
3          
4          
5          
  • ์œ„์™€ ๊ฐ™์€ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ , ํ–‰์€ ์ตœ๋Œ€ ๋ฌด๊ฒŒ, ์—ด์€ ๋ฌผ๊ฑด์˜ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€๋ฅดํ‚ค๋„๋ก ํ•˜์ž.
  0 1 (2, 3) 2 (3, 4) 3 (4, 5) 4 (5, 6)
0 0 0 0 0 0
1 0        
2 0        
3 0        
4 0        
5 0        
  • ์ตœ๋Œ€ ๋ฌด๊ฒŒ๊ฐ€ 0์ผ ๋•Œ, ๊ทธ๋ฆฌ๊ณ  ๋ฌผ๊ฑด์ด ์—†์„ ๋•Œ๋Š” ๊ฐ€๋ฐฉ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๊ฐ€์น˜๋Š” ๋‹น์—ฐํžˆ 0์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ฒซ ํ–‰๊ณผ ์ฒซ ์—ด์€ 0์œผ๋กœ ๋ชจ๋‘ ์ฑ„์›Œ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  0 1 (2, 3) 2 (3, 4) 3 (4, 5) 4 (5, 6)
0 0 0 0 0 0
1 0 0      
2 0        
3 0        
4 0        
5 0        
  • ์ผ๋‹จ ์ฒซ ๋ฌผ๊ฑด์„ ์ƒ๊ฐํ•ด๋ณด์ž. ๋ฌด๊ฒŒ 2, ๊ฐ€์น˜ 3์งœ๋ฆฌ ๋ฌผ๊ฑด์ด๋‹ค. ์ด ๋ฌผ๊ฑด์„ ๊ฐ€์ง€๊ณ  ํ•ด๋‹น ๋ฌผ๊ฑด์ด ๊ฐ ์ตœ๋Œ€ ๋ฌด๊ฒŒ๋‹น ๊ฐ€์ง€๋Š” ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ ๋”ฐ์ ธ๋ณด๋ฉด, ์ตœ๋Œ€ ๋ฌด๊ฒŒ๊ฐ€ 1์ผ ๋•Œ๋Š” ํ˜„์žฌ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ๊ฐ€ 2์ด๊ธฐ ๋•Œ๋ฌธ์— ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ 0์„ ๋„ฃ์–ด์ค€๋‹ค.
  0 1 (2, 3) 2 (3, 4) 3 (4, 5) 4 (5, 6)
0 0 0 0 0 0
1 0 0      
2 0 3      
3 0        
4 0        
5 0        
  • ์ตœ๋Œ€ ๋ฌด๊ฒŒ๊ฐ€ 2์ผ ๋•Œ๋Š” ํ˜„์žฌ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ๊ฐ€ 2์ด๊ธฐ ๋”ฑ ๋งž๊ฒŒ ๋ฌผ๊ฑด์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ๋ฌผ๊ฑด์„ ๋„ฃ๊ฒŒ ๋˜๋ฉด ์ตœ๋Œ€ ๊ฐ€์น˜๋Š” 3์ด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ 1์—ด์˜ 2ํ–‰์—๋Š” 1๋ฒˆ์งธ ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜์ธ 3์„ ๋„ฃ์–ด์ค€๋‹ค.
  0 1 (2, 3) 2 (3, 4) 3 (4, 5) 4 (5, 6)
0 0 0 0 0 0
1 0 0      
2 0 3      
3 0 3      
4 0 3      
5 0 3      
  • ์ฒซ๋ฒˆ์งธ ๋ฌผ๊ฑด์„ ๋„ฃ๊ฒŒ ๋˜๋ฉด, ๋‹ค๋ฅธ ๋ชจ๋“  ์ตœ๋Œ€ ๋ฌด๊ฒŒ์— ๋Œ€ํ•ด์„œ๋Š” ํ•œ๋ฒˆ์”ฉ ๋ชจ๋‘ ๋“ค์–ด๊ฐ„๋‹ค๊ณ  ๋ด์•ผํ•œ๋‹ค. ๋ฌด๊ฒŒ๊ฐ€ 2์ด๋‹ˆ๊นŒ ์ตœ๋Œ€ ๋ฌด๊ฒŒ๊ฐ€ 3์ผ ๋•Œ๋„, 4์ผ ๋•Œ๋„, 5์ผ ๋•Œ๋„ ํ•˜๋‚˜์”ฉ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ 1์—ด์˜ ๋‚จ์€ ํ–‰์€ ๋ชจ๋‘ 3์œผ๋กœ ์ฑ„์›Œ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  0 1 (2, 3) 2 (3, 4) 3 (4, 5) 4 (5, 6)
0 0 0 0 0 0
1 0 0 0    
2 0 3 3    
3 0 3      
4 0 3      
5 0 3      
  • ๋‹ค์Œ ๋ฌผ๊ฑด์œผ๋กœ ๋„˜์–ด๊ฐ€๋ณด์ž. ๋‹ค์Œ์€ (3, 4) ์ด๋‹ค. ์ผ๋‹จ ๋ฌด๊ฒŒ๊ฐ€ 3์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋ฐฉ์˜ ์ตœ๋Œ€๋ฌด๊ฒŒ๊ฐ€ 3์ด ๋  ๋•Œ ๊นŒ์ง€๋Š” ์ด ๋ฌผ๊ฑด์„ ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์ด 3๋ฏธ๋งŒ์˜ ๋ฌด๊ฒŒ์— ๋Œ€ํ•ด์„œ๋Š” ๋ชจ๋‘ 1๋ฒˆ์งธ ๋ฌผ๊ฑด์„ ๋„ฃ์€ ์ƒํƒœ๋กœ ๋‘๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค.
  0 1 (2, 3) 2 (3, 4) 3 (4, 5) 4 (5, 6)
0 0 0 0 0 0
1 0 0 0    
2 0 3 3    
3 0 3 4    
4 0 3      
5 0 3      
  • ์ž ์ด์ œ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋จธ๋ฆฌ๋ฅผ ๊ตด๋ ค๋ณผ ๋•Œ๊ฐ€ ์™”๋‹ค. ์ตœ๋Œ€ ๋ฌด๊ฒŒ๊ฐ€ 3์ด ๋˜์—ˆ์„ ๋•Œ๋Š” ์šฐ๋ฆฌ์—๊ฒŒ ๋‘ ๊ฐ€์ง€ ์„ ํƒ์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ์„ค๋ช…ํ–ˆ์—ˆ๋‹ค. ๋„ฃ๊ฑฐ๋‚˜, ๋„ฃ์ง€ ์•Š๊ฑฐ๋‚˜.
  • ์ด ๋ฌผ๊ฑด์„ ๋„ฃ๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ทธ๋Ÿฐ๋ฐ ๋ฌผ๊ฑด์„ ๋„ฃ๊ฒŒ ๋˜๋ฉด ๊ฐ€๋ฐฉ์˜ ์ตœ๋Œ€ ๋ฌด๊ฒŒ๋ฅผ ์ดˆ๊ณผํ•˜๊ฒŒ ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด ์‹œ์ ์—์„œ๋Š” ๊ฐ€๋ฐฉ์— ์ฒซ๋ฒˆ์งธ ๋ฌผ๊ฑด์ด ๋“ค์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ๋ฌผ๊ฑด์„ ๋„ฃ์œผ๋ ค๋ฉด ์ด๋ฏธ ๋“ค์–ด์žˆ๋Š” ์ฒซ๋ฒˆ์งธ ๋ฌผ๊ฑด์„ ๋นผ๊ณ  ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋„ฃ์–ด์ค˜์•ผํ•œ๋‹ค. ๊ฐ€๋ฐฉ์— ์žˆ๋Š” ๋ฌผ๊ฑด์„ ๋นผ๊ณ  ์ƒˆ ๋ฌผ๊ฑด์„ ๋„ฃ๋Š”๋‹ค๋ฉด, ๊ฐ€๋ฐฉ์˜ ์ตœ๋Œ€ ๊ฐ€์น˜๋Š” ๋‘ ๋ฒˆ์งธ ๋ฌผ๊ฑด์˜ ๊ฐ€์น˜์ธ 4๊ฐ€ ๋œ๋‹ค.
  • ๋ฌผ๊ฑด์„ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ฐ€๋ฐฉ ์•ˆ์—๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฌผ๊ฑด์ด ๋“ค์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋ฐฉ์˜ ์ตœ๋Œ€ ๊ฐ€์น˜๋Š” 3์ด ๋œ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ๊ฐ€๋ฐฉ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๋ฌผ๊ฑด๋“ค์˜ ๊ฐ€์น˜๋ฅผ ์ตœ๋Œ€๋กœ ํ•˜๊ณ  ์‹ถ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•  ์„ ํƒ์ง€๋Š” ๋ฌผ๊ฑด์„ ๋„ฃ์–ด์„œ ๊ฐ€์น˜๊ฐ€ 4๊ฐ€ ๋˜๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  0 1 (2, 3) 2 (3, 4) 3 (4, 5) 4 (5, 6)
0 0 0 0 0 0
1 0 0 0    
2 0 3 3    
3 0 3 4    
4 0 3 4    
5 0 3 7    
  • ๊ฐ€๋ฐฉ์˜ ์ตœ๋Œ€ ๋ฌด๊ฒŒ๊ฐ€ 4์ผ ๋•Œ ์—ญ์‹œ 2๋ฒˆ์งธ ๋ฌผ๊ฑด์„ ๋„ฃ๋Š” ๊ฒƒ์ด ์ด๋“์ด๋‹ค.
  • ๊ฐ€๋ฐฉ์˜ ์ตœ๋Œ€ ๋ฌด๊ฒŒ๊ฐ€ 5์ผ ๋•Œ๋Š” ์–ด๋–จ๊นŒ? ์ฒซ๋ฒˆ์งธ ๋ฌผ๊ฑด์„ ๋„ฃ์€ ์ƒํƒœ์—์„œ ํ˜„์žฌ ๋ฌผ๊ฑด์„ ๋„ฃ์–ด๋„ ๊ฐ€๋ฐฉ์˜ ๋ฌด๊ฒŒ๊ฐ€ ์ดˆ๊ณผ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ตœ๋Œ€ ๋ฌด๊ฒŒ๊ฐ€ 5์ธ ๊ฒฝ์šฐ์—๋Š” ๋‘ ๋ฌผ๊ฑด์„ ๋ชจ๋‘ ๋„ฃ๋Š”๊ฒƒ์ด ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ ๋งŒ๋“œ๋Š” ์„ ํƒ์ผ ๊ฒƒ์ด๋‹ค.
  0 1 (2, 3) 2 (3, 4) 3 (4, 5) 4 (5, 6)
0 0 0 0 0 0
1 0 0 0 0 0
2 0 3 3 3 3
3 0 3 4 4 4
4 0 3 4 5 5
5 0 3 7 7 7
  • ์œ„ ์ž‘์—…์„ ๋ชจ๋“  ๋ฌผ๊ฑด์— ๋Œ€ํ•ด์„œ ์ง„ํ–‰ํ•ด๋ณด์ž. ์šฐ๋ฆฌ๋Š” ์œ„์™€ ๊ฐ™์€ ํ‘œ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ณ , ์ตœ๋Œ€ ๋ฌด๊ฒŒ 5์— ๋Œ€ํ•œ ์ตœ๋Œ€ ๊ฐ€์น˜๋Š” 7์ด๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  • ์–ด๋–ค ์กฐํ•ฉ์œผ๋กœ ์ตœ๋Œ€ ๊ฐ€์น˜์— ์ด๋ฅด๋ €๋Š”์ง€๋Š” ํ•ด๋‹น ๊ฐ€์น˜๊ฐ’์ด ์ตœ์ดˆ๋กœ ๋‚˜์˜จ ์ง€์ ์„ ๋ณด๋ฉด๋œ๋‹ค. ์ด ๊ฒฝ์šฐ์—์„œ๋Š” 1๋ฒˆ์งธ ๋ฌผ๊ฑด๊ณผ, 2๋ฒˆ์งธ ๋ฌผ๊ฑด์„ ๊ฐ€๋ฐฉ์— ๋„ฃ๊ณ  ๋‚˜๋จธ์ง€ ๋ฌผ๊ฑด์€ ๊ฐ€๋ฐฉ์— ๋„ฃ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ตœ๋Œ€ ๊ฐ€์น˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

Pseudo code

์œ„ ๋กœ์ง์„ pseudo code๋กœ ์ ์–ด๋ณด์ž.

for w = 0 to W
    B[0][W] = 0
for i = 1 to n
    B[i][0] = 0
    for w = 1 to W
    if w[i] <= w
        if b[i] + B[i-1][w-w[i]] > B[i-1][w]
            B[i][w] = b[i] + B[i-1][w-w[i]]
        else B[i][w] = B[i-1][w]
    else
        B[i][w] = B[i-1][w]

์ฑ…์— ๋‚˜์™€์žˆ๋Š” ์ฝ”๋“œ์ธ๋ฐ ๋ณ€์ˆ˜๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ์•ˆ๋‚˜์™€ ์žˆ์–ด์„œ ์ž˜ ์™€๋‹ฟ์ง€ ์•Š๋Š”๋‹ค. ๋ฐฑ์ค€์— ๋™์ผํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋‹ˆ [๋ฐฑ์ค€ ์•Œ๊ณ ๋ฆฌ์ฆ˜] ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์ž. vector, pair, ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ๋‚˜ algorithm์— ๋“ค์–ด์žˆ๋Š” max ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋” ์ˆ˜์›”ํ•˜๊ฒ ์ง€๋งŒ ์ตœ๋Œ€ํ•œ pseudo code๋ž‘ ๋น„์Šทํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค. PS ํฌ์ŠคํŠธ๋Š” STL๋กœ ๋” ๊น”๋”ํ•œ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค์–ด์„œ ์˜ฌ๋ ค๋ณด์ž.

implementation - BOJ 12865

๋ฌธ์ œ
์ด ๋ฌธ์ œ๋Š” ์•„์ฃผ ํ‰๋ฒ”ํ•œ ๋ฐฐ๋‚ญ์— ๊ด€ํ•œ ๋ฌธ์ œ์ด๋‹ค.

 

ํ•œ ๋‹ฌ ํ›„๋ฉด ๊ตญ๊ฐ€์˜ ๋ถ€๋ฆ„์„ ๋ฐ›๊ฒŒ ๋˜๋Š” ์ค€์„œ๋Š” ์—ฌํ–‰์„ ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ์„ธ์ƒ๊ณผ์˜ ๋‹จ์ ˆ์„ ์Šฌํผํ•˜๋ฉฐ ์ตœ๋Œ€ํ•œ ์ฆ๊ธฐ๊ธฐ ์œ„ํ•œ ์—ฌํ–‰์ด๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ€์ง€๊ณ  ๋‹ค๋‹ ๋ฐฐ๋‚ญ ๋˜ํ•œ ์ตœ๋Œ€ํ•œ ๊ฐ€์น˜ ์žˆ๊ฒŒ ์‹ธ๋ ค๊ณ  ํ•œ๋‹ค.

 

์ค€์„œ๊ฐ€ ์—ฌํ–‰์— ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” N๊ฐœ์˜ ๋ฌผ๊ฑด์ด ์žˆ๋‹ค. ๊ฐ ๋ฌผ๊ฑด์€ ๋ฌด๊ฒŒ W์™€ ๊ฐ€์น˜ V๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ํ•ด๋‹น ๋ฌผ๊ฑด์„ ๋ฐฐ๋‚ญ์— ๋„ฃ์–ด์„œ ๊ฐ€๋ฉด ์ค€์„œ๊ฐ€ V๋งŒํผ ์ฆ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์•„์ง ํ–‰๊ตฐ์„ ํ•ด๋ณธ ์ ์ด ์—†๋Š” ์ค€์„œ๋Š” ์ตœ๋Œ€ K๋ฌด๊ฒŒ๊นŒ์ง€์˜ ๋ฐฐ๋‚ญ๋งŒ ๋“ค๊ณ  ๋‹ค๋‹ ์ˆ˜ ์žˆ๋‹ค. ์ค€์„œ๊ฐ€ ์ตœ๋Œ€ํ•œ ์ฆ๊ฑฐ์šด ์—ฌํ–‰์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฐ๋‚ญ์— ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ฑด๋“ค์˜ ๊ฐ€์น˜์˜ ์ตœ๋Œ“๊ฐ’์„ ์•Œ๋ ค์ฃผ์ž.

 

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

์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ๋ชจ๋“  ์ˆ˜๋Š” ์ •์ˆ˜์ด๋‹ค.

#include <cstdio>

#define WEIGHT 0
#define VALUE 1

using namespace std;

int main()
{
    int dp[101][100001] = {0, };
    int item[101][2];

    int N, K;
    scanf("%d %d", &N, &K);

    for (int i = 1; i <= N; i++){
        scanf("%d %d", &item[i][WEIGHT], &item[i][VALUE]);
    }

    for (int i = 1 ; i <= N ; i++){
        for (int w = 1 ; w <= K ; w++){
            if (item[i][WEIGHT] <= w){ // ์ตœ๋Œ€ ๋ฌด๊ฒŒ๋ฅผ ํ•˜๋‚˜์”ฉ ์˜ฌ๋ ค๊ฐ€๋ฉด์„œ ๊ณ„์‚ฐ
                if ((item[i][VALUE] + dp[i-1][w-item[i][WEIGHT]]) > dp[i-1][w]) // ์ด์ „ ์ตœ๋Œ€๊ฐ€์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ด์ „๊ฑธ ๋นผ๊ณ  ํ˜„์žฌ๋ฌผ๊ฑด์„ ๋„ฃ๋Š”๊ฒŒ ๋” ์ข‹๋‹ค๋ฉด ๋„ฃ์–ด์ฃผ์ž
                    dp[i][w] = item[i][VALUE] + dp[i-1][w-item[i][WEIGHT]];
                else dp[i][w] = dp[i-1][w]; // ์•„๋‹ˆ๋ผ๋ฉด ์ด์ „๊ฐ€์น˜๋ฅผ  ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ
            }
            else{
                dp[i][w] = dp[i-1][w];
            }
        }
    }

    printf("%d", dp[N][K]);
    return 0;
}

Algorithm Analysis

DP ๋กœ ์ ‘๊ทผํ•œ Knapsack Problem์˜ time complexity๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ 2์ฐจ์› ๋ฐฐ์—ด์„ ๋ชจ๋‘ ์ฑ„์›Œ์ฃผ๋ฉด ๋๋‚˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฌด๊ฒŒ W, ๋ฌผ๊ฑด์˜ ๊ฐฏ์ˆ˜ N์— ๋Œ€ํ•ด ี•(NW) ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.