0/1 Knapsack Problem์ด๋?
< ์ฃผ์ด์ง๋ ์กฐ๊ฑด >
์ฉ๋์ด W์ธ ๋ฐฐ๋ญ, N๊ฐ์ ๋ฌผ๊ฑด(๊ฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ(w)์ ๊ฐ์น(v)๊ฐ ์ฃผ์ด์ง)
1. ๋ฐฐ๋ญ์ ๋ด์ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ์ ํฉ์ด W๋ฅผ ์ด๊ณผํ์ง ์์ผ๋ฉด์
2. ๋ด์ ์ ์๋ ์ต๋ ๊ฐ์น๋ฅผ ์ฐพ๋๋ค.
๋ฌผ๊ฑด์ ์ชผ๊ฐค ์ ์๋ค๋ฉด > Fraction Knapsack Problem
๋ฌผ๊ฑด์ ์ชผ๊ฐค ์ ์๋ค๋ฉด > 0/1 Knapsack Problem
์ ๊ทผ๋ฒ
DP ์ค์์๋ ์์ ๋ฌธ์ ์ ํด๋ก ํฐ ๋ฌธ์ ์ ํด๋ฅผ ์ฐพ๋ ์ํฅ์ ์ ๊ทผ๋ฒ์ ์ฌ์ฉํ๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ํ์์ ๊ตฌํด์ผ ํ๋ค.
๋ถ๋ถ ๋ฌธ์ ๋ฅผ ์ ์ํด ๋ณด๋ฉด,
๋ฌผ๊ฑด์ ๋ด์ ์ ์๋ ๊ฒฝ์ฐ์ ๋ด์ ์ ์๋ ๊ฒฝ์ฐ๋ก ๋๋ ์ ์๊ณ
๋ด์ ์ ์๋ ๊ฒฝ์ฐ์๋ ๋ฌผ๊ฑด์ ๋ฃ๊ธฐ๋ก ๊ฒฐ์ ํ๊ฑฐ๋ ๋ฌผ๊ฑด์ ์ ๋ฃ๊ธฐ๋ก ๊ฒฐ์ ํ๋ ๊ฒฝ์ฐ๋ก ๋ ๋๋ ์ ์๋ค.
์ ๋ฆฌํ๋ฉด,
1. ๋ฌผ๊ฑด์ ๋ด์ ์ ์๋ ๊ฒฝ์ฐ --> ํ์ฌ๊ฐ i๋ฒ์งธ๋ผ๊ณ ํ์ ๋, i-1๋ฒ์งธ๊น์ง์ ๊ฐ์น๋ฅผ ๊ทธ๋๋ก ๋ค๊ณ ์ค๋ฉด ๋จ
2. ๋ฌผ๊ฑด์ ๋ด์ ์ ์๊ณ , ๋ฃ๊ธฐ๋ก ๊ฒฐ์ --> i-1๋ฒ์งธ๊น์ง์ ๊ฐ์น์ ํ์ฌ ๊ฐ์น๋ฅผ ๋ํ ๊ฐ์ ์ ์ฅ
3. ๋ฌผ๊ฑด์ ๋ด์ ์ ์๊ณ , ์ ๋ฃ๊ธฐ๋ก ๊ฒฐ์ --> i-1๋ฒ์งธ๊น์ง์ ๊ฐ์น๋ฅผ ์ ์ฅ
๋ฌผ๊ฑด์ ๋ด์ ์ ์๋ ๊ฒฝ์ฐ๋ 2๋ฒ๊ณผ 3๋ฒ ์ค ํฐ ๊ฐ์ ์ ์ฅํ๋ฉด ๋๋ค.
์ฝ๋
0/1 Knapsack์ ๋ํ ๋ฌธ์ ์ธ ๋ฐฑ์ค 12865 ํ๋ฒํ ๋ฐฐ๋ญ ๋ฌธ์ ์ Python ์ฝ๋๋ฅผ ๋ค๊ณ ์๋ค.
import sys
input = sys.stdin.readline
n, k = map(int, input().split())
backpack = [list(map(int, input().split())) for _ in range(n)]
zero = [[0, 0]]
bp = zero + backpack
dp = [[0]*(k+1) for _ in range(n+1)]
for i in range(1, n+1):
for w in range(k+1):
if bp[i][0] > w: # ๋ชป๋ฃ๋ ์ํฉ
dp[i][w] = dp[i-1][w]
else: # ๋ฃ๋ ์ํฉ
dp[i][w] = max(bp[i][1] + dp[i-1][w - bp[i][0]], dp[i-1][w])
print(dp[n][k])
< ๋ณ์ ๊ฐ๋ต ์ค๋ช >
- zero๋ฅผ ๋ํด์ค ์ด์ ๋ ๋ฐฐ์ด์ i-1๋ฒ์งธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ IndexError๋ฅผ ๋ง๊ธฐ ์ํด ์์๋ก 0๋ฒ์งธ ๋ฌผ๊ฑด์ ์ถ๊ฐํด ์ฃผ์๋ค.
- bp๋ฐฐ์ด์ [0]๋ฒ์งธ์ ๋ฌด๊ฒ, [1]๋ฒ์งธ์ ๊ฐ์น๊ฐ ๋ค์ด์จ๋ค.
- dp๋ฐฐ์ด์ n*k ํฌ๊ธฐ์ 2์ฐจ์ ๋ฐฐ์ด์ด๋ค.
์์์ ์ ๋ฆฌํ๋ ๋ถ๋ถ ๋ฌธ์ ๋ฅผ ๋ค๊ณ ์ค๋ฉด,
1. ๋ฌผ๊ฑด์ ๋ด์ ์ ์๋ ๊ฒฝ์ฐ
--> ์ด ๋ฌผ๊ฑด์ ๋ฌด๊ฒ(bp[i][0])๊ฐ ํ์ฌ ๋ฌด๊ฒํ๋(w)๋ฅผ ๋์ด์ค ๋ ๋ชป ๋ฃ์. ๋ฌด์กฐ๊ฑด dp[i-1][w] ์ ์ฅ.
2. ๋ฌผ๊ฑด์ ๋ด์ ์ ์๊ณ , ๋ฃ๊ธฐ๋ก ๊ฒฐ์
3. ๋ฌผ๊ฑด์ ๋ด์ ์ ์๊ณ , ์ ๋ฃ๊ธฐ๋ก ๊ฒฐ์
--> ์ด ๋ฌผ๊ฑด์ ๋ฌด๊ฒ(bp[i][0])๊ฐ ํ์ฌ ๋ฌด๊ฒํ๋(w) ์ดํ์ผ ๋ ๋ฃ์ ์ ์์.
ํ์ฌ ๊ฐ์น + i-1๋ฒ์งธ๊น์ง์ ๊ฐ์น(bp[i][1] + dp[i-1][w - bp[i][0]])์ i-1๋ฒ์งธ๊น์ง์ ๊ฐ์น์ธ dp[i-1][w] ์ค ํฐ ๊ฐ ์ ์ฅ
์ด๋ ๊ฒ ํด์ ๋ง์ง๋ง๊น์ง ๋ฌผ๊ฑด์ ๋ค ๋ด์๋ดค์ ๋์ ์ต์ ํด๋ฅผ ์ถ๋ ฅํ๋ฉด ๋ต์ด ๋์จ๋ค.
๋ํ์ ์ธ 0/1 Knapsack ๋ฌธ์
12865๋ฒ: ํ๋ฒํ ๋ฐฐ๋ญ
์ฒซ ์ค์ ๋ฌผํ์ ์ N(1 ≤ N ≤ 100)๊ณผ ์ค์๊ฐ ๋ฒํธ ์ ์๋ ๋ฌด๊ฒ K(1 ≤ K ≤ 100,000)๊ฐ ์ฃผ์ด์ง๋ค. ๋ ๋ฒ์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ๊ฑฐ์ณ ๊ฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ W(1 ≤ W ≤ 100,000)์ ํด๋น ๋ฌผ๊ฑด์ ๊ฐ์น V(0 ≤ V ≤ 1,000)
www.acmicpc.net
SW Expert Academy
SW ํ๋ก๊ทธ๋๋ฐ ์ญ๋ ๊ฐํ์ ๋์์ด ๋๋ ๋ค์ํ ํ์ต ์ปจํ ์ธ ๋ฅผ ํ์ธํ์ธ์!
swexpertacademy.com