KnapSack Algorithm

KnapSack Algorithm(λ°°λ‚­ 문제)λŠ” DP μ•Œκ³ λ¦¬μ¦˜ 쀑 ν•˜λ‚˜λ‹€.

λ°°λ‚­ λ¬Έμ œλŠ” λ‹€μŒμ˜ 상황을 κ°€μ§„λ‹€.

n개의 짐과 배낭이 μžˆμ„ λ•Œ, 각각의 짐은 κ°€μΉ˜μ™€ λ¬΄κ²Œκ°€ μžˆλ‹€.

배낭에 짐을 담을 수 μžˆλŠ” μ΅œλŒ€ μš©λŸ‰μ΄ μ‘΄μž¬ν•  λ•Œ, 배낭에 담을 수 μžˆλŠ” κ°€μΉ˜μ˜ μ΅œλŒ“κ°’μ„ 찾아라.

이 λ¬Έμ œκ°€ μ™œ DP에 ν•΄λ‹Ήλ κΉŒ?

이 μƒν™©μ—μ„œ κ°€λŠ₯ν•œ λͺ¨λ“ μ‘°ν•©μ€ 2n2^n이닀. ν•˜μ§€λ§Œ 이 경우λ₯Ό λͺ¨λ‘ μ‚΄ν”ΌκΈ°μ—” λ„ˆλ¬΄ λ§Žμ€ μ‹œκ°„μ΄ μ†Œμš”λœλ‹€.

κ·Έλ ‡λ‹€λ©΄ DPλ₯Ό κ³ λ €ν–ˆμ„ λ•Œ, λΆ€λ¬Έμ œλ₯Ό μ–΄λ–»κ²Œ μ •μ˜ν•΄μ•Ό ν• μ§€κ°€ λ¬Έμ œμ΄λ‹€.

μ΅œλŒ€ 무게

κ°€λ°©μ˜ 무게λ₯Ό κΈ°μ€€μœΌλ‘œ ν•΄κ²°ν•  수 μžˆλŠ”μ§€ 고렀해보면 λΆˆκ°€λŠ₯ν•˜λ‹€. μ™œλƒν•˜λ©΄ μ΅œλŒ€ λ¬΄κ²Œκ°€ 4μΌλ•Œ μ΅œλŒ€ κ°€μΉ˜κ°€, μ΅œλŒ€ λ¬΄κ²Œκ°€ 5μΌλ•Œ μ΅œλŒ€ κ°€μΉ˜λ‘œ 이어지지 μ•ŠλŠ”λ‹€. 짐을 λΉΌκ³  λ‹€μ‹œ λ„£μœΌλ©΄ μ•„μ˜ˆ 달라지기 λ•Œλ¬Έμ΄λ‹€.

짐의 선택 μ—¬λΆ€

배낭에 짐을 넣을 λ•Œ 두 κ°€μ§€ 선택을 ν•  수 μžˆλ‹€.

  1. 짐을 배낭에 λ„£λŠ”λ‹€.

  2. 짐을 배낭에 λ„£μ§€ μ•ŠλŠ”λ‹€.

λ§Œμ•½ λ„£μœΌλ €λŠ” 짐의 λ¬΄κ²Œκ°€ λ°°λ‚­μ˜ 무게λ₯Ό μ΄ˆκ³Όν•œλ‹€λ©΄, λ„£μ§€ μ•ŠλŠ”λ‹€. ν•˜μ§€λ§Œ 짐을 넣을 수 μžˆλ‹€κ³  ν•΄μ„œ λ‹€ λ„£μœΌλ©΄ λ§Œμ•½ 후에 배낭에 λ„£μ—ˆμ„ λ•Œ 더 κ°€μΉ˜κ°€ 높은 짐을 λͺ» λ„£λŠ” κ²½μš°κ°€ 생긴닀. 이 상황 λ˜ν•œ κ³ λ €ν•΄μ•Ό ν•œλ‹€. 그러면 κ²°κ΅­ 더 μžμ„Ένžˆ 상황을 정리해야 ν•œλ‹€.

  • μƒˆλ‘œμš΄ 짐을 λ„£μ§€ μ•ŠλŠ”λ‹€.

  • μƒˆλ‘œμš΄ 짐을 λ„£κΈ° μœ„ν•΄ ν˜„μž¬ 물건에 넣을 곡간을 λ§Œλ“€μ–΄μ„œ 물건을 λ„£λŠ”λ‹€.

이 상황을 μˆ˜μ‹μœΌλ‘œ ν‘œν˜„ν•˜λ©΄,

DP[i][w] = max(DP[i-1][w], DP[i][w-(짐 i의 무게)] + 짐 i의 κ°€μΉ˜

λ„£μ§€ μ•ŠλŠ” κ²½μš°μ™€ 짐을 λ„£λŠ” 경우(ν˜„μž¬ λ°°λ‚­μ—μ„œ 짐 i의 무게λ₯Ό 뺐을 λ•Œμ˜ μ΅œλŒ€ κ°€μΉ˜μ—μ„œ 짐 i 의 무게λ₯Ό 더함) 쀑 μ΅œλŒ€κ°’μ„ μ„ νƒν•œλ‹€.

이 경우λ₯Ό ν‘œλ‘œ λΉ„κ΅ν•΄λ³΄μž.

짐 \ λ°°λ‚­ 무게
0
1
2
3
4
5
6
7

1: 6 / 13

0

0

0

0

0

0

13

13

2: 3 / 6

0

0

0

6

6

6

13

13

3: 4 / 8

0

0

0

6

8

8

13

14

4: 5 / 12

0

0

0

6

8

12

13

14

μœ„μ™€ 같이 값을 κ°€μ§€κ²Œ λœλ‹€

3번 μ§μ—μ„œ λ°°λ‚­μ˜ λ¬΄κ²Œκ°€ 7인 경우λ₯Ό μ‚΄νŽ΄λ³΄μž.

λ°°λ‚­μ˜ λ¬΄κ²Œκ°€ 6일 λ•Œ μ΅œλŒ€ κ°€μΉ˜λŠ” 13이닀. λ°°λ‚­μ˜ λ¬΄κ²Œκ°€ 7인 경우λ₯Ό μ‚΄ν•„ λ•Œ 3번 짐을 λ„£λŠ” κ²½μš°μ™€ λ„£μ§€ μ•ŠλŠ” 경우λ₯Ό μ‚΄νŽ΄μ•Ό ν•œλ‹€. λ„£μ§€ μ•ŠλŠ” κ²½μš°λŠ” 이전값을 κ·ΈλŒ€λ‘œ κ°€μ Έμ˜¨λ‹€.

λ„£λŠ” κ²½μš°λŠ” 2λ²ˆμ§κΉŒμ§€ κ³ λ €ν•˜λ©΄μ„œ λ°°λ‚­ λ¬΄κ²Œκ°€ 3일 λ•Œμ˜ μ΅œλŒ€ κ°€μΉ˜μ—μ„œ 3번 짐을 λ„£λŠ” 상황이 μ΅œλŒ€ κ°€μΉ˜κ°€ λœλ‹€. λ”°λΌμ„œ λΉ„κ΅λŠ” 13 vs 6 + 8 둜 이루어진닀.

즉, μœ„μ˜ ν‘œλ₯Ό 2차원 리슀트라고 μƒκ°ν•œλ‹€λ©΄, μœ„μ²˜λŸΌ μˆ˜μ‹ν™”ν•  수 μžˆλ‹€.

dpλŠ” μœ„μ˜ ν‘œλ₯Ό 2차원 λ°°μ—΄λ‘œ λ‚˜νƒ€λ‚Έ 것이고, item 2차원 배열은 각 짐의 λ¬΄κ²Œμ™€ κ°€μΉ˜λ₯Ό λ‚˜νƒ€λ‚Έ 것이닀.

Last updated