[Dynamic Programming] ๋ฐฐ๋ญ ๋ฌธ์ (Knapsack Problem)
์ค๋ช
๋ฐฐ๋ญ ๋ฌธ์ (Knapsack Problem)๋ ์กฐํฉ ์ต์ ํ์ ์ ๋ช ํ ๋ฌธ์ ๋ค.
์๋ฅผ ๋ค์ด ์ค๋ช ํด๋ณด์. ํ ์ฌํ๊ฐ๊ฐ ์ฌํ์ ๋ ๋๋ ค๊ณ ํ๋ค. ์ฌํ๊ฐ๊ฐ ๊ฐ์ง๊ณ ๊ฐ๋ ๋ฐฐ๋ญ์๋ ๋ด์ ์ ์๋ ๋ฌด๊ฒ์ ์ต๋๊ฐ์ด ์ ํด์ ธ ์๊ณ ๋ฐฐ๋ญ์ ๋ฃ์ ์ ์๋ ์ง์๋ ๊ฐ๊ฐ์ ๋ฌด๊ฒ(W)์ ๊ฐ์น(V)๊ฐ ์ ํด์ ธ ์๋ค.
์ด ์ฌํ๊ฐ๊ฐ ๋ฐฐ๋ญ์ ๋ฌด๊ฒ๋ฅผ ์ต๋ํ ๊ฝ ์ฑ์ฐ๋ ๊ฐ์น์ ํฉ์ด ์ต๋๊ฐ ๋๋๋ก ์ง์ ๊ณ ๋ฅด๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
์ฌ๊ธฐ์ ์ง์ ์ชผ๊ฐค ์ ์๋ ๊ฒฝ์ฐ(๋ฌด๊ฒ๊ฐ ์์์ผ ์ ์๋ ๊ฒฝ์ฐ)์ ์ง์ ์ชผ๊ฐค ์ ์๋ ๊ฒฝ์ฐ ๋ ๊ฐ์ง๋ก ๋๋ ์ ์๋ค.
- ์ง์ ์ชผ๊ฐค ์ ์๋ ๋ถํ ๊ฐ๋ฅ ๋ฐฐ๋ญ ๋ฌธ์ (Fractional Knapsack Problem) - ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ
- ์ง์ ์ชผ๊ฐค ์ ์๋ ๋ฐฐ๋ญ ๋ฌธ์ (Knapsack Problem) - ๋์ ๊ณํ๋ฒ(Dynamic Programming)
์ด ๊ธ์์๋ ์ง์ ์ชผ๊ฐค ์ ์๋ ๋ฐฐ๋ญ ๋ฌธ์ (Knapsack Problem)๋ฅผ ๋์ ๊ณํ๋ฒ(Dynamic Programming)์ ํตํด ํ์ด๋๊ฐ๋ ๊ณผ์ ์ ์๊ฐํ๊ณ ์ ํ๋ค.
๋ฌธ์ ๋ฐ ํ์ด
ํ ๋ฌ ํ๋ฉด ๊ตญ๊ฐ์ ๋ถ๋ฆ์ ๋ฐ๊ฒ ๋๋ ์ค์๋ ์ฌํ์ ๊ฐ๋ ค๊ณ ํ๋ค.
์ธ์๊ณผ์ ๋จ์ ์ ์ฌํผํ๋ฉฐ ์ต๋ํ ์ฆ๊ธฐ๊ธฐ ์ํ ์ฌํ์ด๊ธฐ ๋๋ฌธ์, ๊ฐ์ง๊ณ ๋ค๋ ๋ฐฐ๋ญ ๋ํ ์ต๋ํ ๊ฐ์น ์๊ฒ ์ธ๋ ค๊ณ ํ๋ค.
์ค์๊ฐ ์ฌํ์ ํ์ํ๋ค๊ณ ์๊ฐํ๋ N๊ฐ์ ๋ฌผ๊ฑด์ด ์๋ค.
๊ฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ W์ ๊ฐ์น V๋ฅผ ๊ฐ์ง๋๋ฐ, ํด๋น ๋ฌผ๊ฑด์ ๋ฐฐ๋ญ์ ๋ฃ์ด์ ๊ฐ๋ฉด ์ค์๊ฐ V๋งํผ ์ฆ๊ธธ ์ ์๋ค.
์์ง ํ๊ตฐ์ ํด๋ณธ ์ ์ด ์๋ ์ค์๋ ์ต๋ K๋ฌด๊ฒ๊น์ง์ ๋ฐฐ๋ญ๋ง ๋ค๊ณ ๋ค๋ ์ ์๋ค.
์ค์๊ฐ ์ต๋ํ ์ฆ๊ฑฐ์ด ์ฌํ์ ํ๊ธฐ ์ํด ๋ฐฐ๋ญ์ ๋ฃ์ ์ ์๋ ๋ฌผ๊ฑด๋ค์ ๊ฐ์น์ ์ต๋๊ฐ์ ์๋ ค์ฃผ์.
๋ฐฑ์ค ์๊ณ ๋ฆฌ์ฆ 12865๋ฒ ํ๋ฒํ ๋ฐฐ๋ญ ๋ฌธ์
์ถ์ฒ: https://www.acmicpc.net/problem/12865
์ค์๊ฐ ์ต๋ ๋ฌด๊ฒ ํ์ฉ๋์ด 7์ธ ๋ฐฐ๋ญ๊ณผ ๋ค์๊ณผ ๊ฐ์ ์ง๋ค์ด ์๋ค๊ณ ๊ฐ์ ํ์.
๋ฌด๊ฒ | ๊ฐ์น | |
์ง 1 | 3 | 6 |
์ง 2 | 4 | 8 |
์ง 3 | 5 | 12 |
์ง 4 | 6 | 13 |
์ฝ๊ฒ ํ ์ ์๋ ์๊ฐ์ผ๋ก๋
1. ์ง 4๊ฐ ์ค 1๊ฐ๋ฅผ ๊ณจ๋ผ ์ต๋ ๊ฐ์น๋ฅผ ๊ณ์ฐ
2. ์ง 4๊ฐ ์ค 2๊ฐ๋ฅผ ๊ณจ๋ผ ์ต๋ ๊ฐ์น๋ฅผ ๊ณ์ฐ
3. ์ง 4๊ฐ ์ค 3๊ฐ๋ฅผ ๊ณจ๋ผ ์ต๋ ๊ฐ์น๋ฅผ ๊ณ์ฐ
4. ์ง 4๊ฐ ์ค 4๊ฐ๋ฅผ ๊ณจ๋ผ ์ต๋ ๊ฐ์น๋ฅผ ๊ณ์ฐ
5. 1~4 ๊ณผ์ ์์ ๋์จ ๊ฐ ์ค ๊ฐ์ฅ ๋์ ๊ฐ์ด ์ต๋ ๊ฐ
์ด๋ ๊ฒ ์๊ฐํ ์ ์๊ฒ ์ผ๋ ํด๋น ๋ฐฉ์์
nC0 + nC1 + ... + nC r = 2^n
์ ๊ฐ์ ๊ฒฝ์ฐ์ ์๊ฐ ๋์ฌ ์ ์๊ณ ๋๋ฌด ๋ง์ ์๊ฐ์ ์๋ชจํ๊ฒ ๋๋ค.
๋ฐ๋ผ์ ์ด์ ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด ๋๊ณ ํ์ฉํ ์ ์๋ ๋์ ๊ณํ๋ฒ(Dynamic Programming)์ ์ฌ์ฉํด๋ณด์.
์ง์ ๋ฒํธ๋ฅผ i, ๋ฌด๊ฒ๋ฅผ w, ๊ฐ์น๋ฅผ ๋ํ๋ด๋ ํจ์๋ฅผ Val์ด๋ผ๊ณ ํด๋ณด์.
Val(i, w): ~i ๋ฒ์งธ๊น์ง ์ง์ ๋ํด ๋ฐฐ๋ญ์ ๋ฌด๊ฒ๊ฐ w๊น์ง ํ์ฉ๋์ ๋ ์ต๋ ๊ฐ์น
์ง ๋ฒํธ/๋ฌด๊ฒ | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
1 | 0 | 0 | |||||
2 | |||||||
3 | |||||||
4 |
๋ค์๊ณผ ๊ฐ์ด ๋ณด๊ธฐ ์ฝ๊ฒ ํ๋ฅผ ์์ฑํ๊ณ ์ฒ์๋ถํฐ ์์ฑํด ๋๊ฐ ๋ณด์, [์ง 1]์ ๋ฌด๊ฒ๊ฐ 3 ๊ฐ์น๊ฐ 6์ด๋ค.
[์ง 1]๋ง ์๊ฐํด๋ณธ๋ค๋ฉด ๋ฐฐ๋ญ์ ๋ฌด๊ฒ๊ฐ 2๊น์ง๋ ์๋ฌด๊ฒ๋ ์ค์ ์ ์์ผ๋ฏ๋ก ๊ฐ์น ํฉ์ 0์ผ๋ก ์ ๋๋ค.
์ง ๋ฒํธ/๋ฌด๊ฒ | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
1 | 0 | 0 | 6 | 6 | 6 | 6 | 6 |
2 | |||||||
3 | |||||||
4 |
๋ฐฐ๋ญ์ ๋ฌด๊ฒ 3๋ถํฐ๋ [์ง 1]์ ๋ฌด๊ฒ๊ฐ 3์ด๋ฏ๋ก ์ง 1์ ์ค์ ์ ์๊ฒ ๋๋ค. ์ดํ์๋ ์ง 1๋ง ์๋ค๊ณ ๊ฐ์ ํ ๊ฒ์ด๋ฏ๋ก ๋ชจ๋ ๋ฐฐ๋ญ์ ๋ฌด๊ฒ๊ฐ ๋์ด๋๋ ์ต๋ ๊ฐ์น๋ 6์ด ๋๋ค.
์ง ๋ฒํธ/๋ฌด๊ฒ | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
1 | 0 | 0 | 6 | 6 | 6 | 6 | 6 |
2 | 0 | 0 | 6 | 8 | 8 | 8 | 14 |
3 | |||||||
4 |
๋ค์์ผ๋ก [์ง 2]๊น์ง ์๊ฐํด๋ณธ๋ค๋ฉด ๋ฐฐ๋ญ์ ๋ฌด๊ฒ๊ฐ 3๊น์ง๋ [์ง 1]๋ฐ์ ์ค์ ์ ์์ผ๋ฏ๋ก ์์ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋๋ก ์ ์ด์ค๋ค.
๋ฐฐ๋ญ์ ๋ฌด๊ฒ 4๋ถํฐ๋ [์ง 2]๋ฅผ ์ค์ ์ ์๋ค.
[์ง์ด 1๊น์ง ์์์ ๋, (๋ฐฐ๋ญ์ ๋ฌด๊ฒ 4 - ์ง 2์ ๋ฌด๊ฒ 4)์ ๊ฐ์น] + ์ง 2์ ๊ฐ์น = 8
(↑์ง 2๋ฅผ ์๋ก ๋ฃ์ ๊ฒฝ์ฐ)
or
[์ง์ด 1๊น์ง ์์์ ๋, ๋ฐฐ๋ญ์ ๋ฌด๊ฒ 4์ ๊ฐ์น = 6
๋ฐฐ๋ญ์ ๋ฌด๊ฒ 4์์๋ ์์ ๊ฐ์ด ๋น๊ตํด๋ณด๋ฉด 8์ ๊ฐ์น๊ฐ ๋ ํฌ๋ฏ๋ก 8์ ์ ์ด์ค๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก, ๋ฐฐ๋ญ์ ๋ฌด๊ฒ 7์์๋
[์ง์ด 1๊น์ง ์์์ ๋, (๋ฐฐ๋ญ์ ๋ฌด๊ฒ 7 - ์ง 2์ ๋ฌด๊ฒ 4)์ ๊ฐ์น] + ์ง 2์ ๊ฐ์น = 14
(6 + 8 = 14)
or
[์ง์ด 1๊น์ง ์์์ ๋, ๋ฐฐ๋ญ์ ๋ฌด๊ฒ 4์ ๊ฐ์น = 6
14๊ฐ 6๋ณด๋ค ํฌ๋ฏ๋ก 14๋ฅผ ์ ์ด์ค๋ค.
์ด์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ํ๋ฅผ ์ญ ์ฑ์๋๊ฐ๋ฉด,
์ง ๋ฒํธ/๋ฌด๊ฒ | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
1 | 0 | 0 | 6 | 6 | 6 | 6 | 6 |
2 | 0 | 0 | 6 | 8 | 8 | 8 | 14 |
3 | 0 | 0 | 6 | 8 | 12 | 12 | 14 |
4 | 0 | 0 | 6 | 8 | 12 | 13 | 14 |
์ ๊ฐ์ ํ๊ฐ ์์ฑ๋๊ณ ์ต๋ ๊ฐ์น๋ 14๋ผ๋ ๊ฒ์ ๊ตฌํ ์ ์๋ค.
๋ง๋ฌด๋ฆฌ๋ก, ์ ํ์์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ๋ฆฌํ ์ ์๋ค.
Val(i, w) = (w >= weight[i]) ? max( Val(i-1,w), Val(i-1,w-weight[i])+value[i] ) : Val(i-1, w)
โป weight[i] = i๋ฒ์งธ ์ง์ ๋ฌด๊ฒ, value[i] = i๋ฒ์งธ ์ง์ ๊ฐ์น
๊ด๋ จ ๋ฌธ์
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote