[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ๋ฐฐ๋ญ ๋ฌธ์ (Knapsack Problem)
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
์ ์ ๊ทผ์ด ์๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก ์ด๋ป๊ฒ ์ ๊ทผํด์ผ ํ ๊น. ๋ฐฐ๋ญ์ ๋ฌผ๊ฑด์ ๋ฃ์ ๋, ์ฐ๋ฆฌ๊ฐ ์ ํํ ์ ์๋ ๊ฒฝ์ฐ๋ ๋ ๊ฐ์ง๊ฐ ์๋ค.
- ๋ฌผ๊ฑด์ ๋ฃ๋๋ค.
- ๋ฌผ๊ฑด์ ๋ฃ์ง ์๋๋ค.
๋ง์ฝ ํ์ฌ ๋ด๊ฐ ๋ฃ์ผ๋ ค๊ณ ํ๋ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๊ฐ ์ ์ฒด ์ ํ๋ฌด๊ฒ๋ฅผ ์ด๊ณผํ๋ค๋ฉด, ์ ํ์ง๋ ๋ฌผ๊ฑด์ ๋ฃ์ง ์๋ ๊ฒ ๋ฐ์ ์๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ ์์ ์ผ๋จ ํ๋ ๋ง๋ค ์ ์๋ค.
B๋ DP๋ฅผ ์ํ ์ต๋๊ฐ์น๋ฅผ ๋ด๋ ๋ฐฐ์ด์ด๊ณ , k๋ ํ์ฌ ๋ฃ์ ๋ฌผ๊ฑด์ ๋ฒํธ, W์ ์ต๋ ๋ฌด๊ฒ๋ฅผ ์๋ฏธํ๋ค. wk ๋ k๋ฒ์งธ ๋ฌผ๊ฑด์ ๋ํ ๋ฌด๊ฒ๋ฅผ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ ์ ์์ k๋ฒ์งธ ๋ฌผ๊ฑด์ด ์ด ์ ํ ๋ฌด๊ฒ๋ฅผ ์ด๊ณผํ๋ค๋ฉด k๋ฒ์งธ ์ต๋๊ฐ์น๋ฅผ ๋ฐ๋ก k-1๋ฒ์งธ ๋ฌผ๊ฑด์ ๋ฃ์ ๊ฒฝ์ฐ์ ๊ฐ์น๋ก ์ ํ๋ ๊ฒ์ด๋ค.
๋ง์ฝ ๋ฌผ๊ฑด์ ๋ฃ์ ์ ์๋ ๋ฌด๊ฒ๊ฐ ์กฐ๊ธ์ด๋ผ๋ ๋จ์๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น? ์ด๋ ์ฐ๋ฆฌ์ ์ ํ์ง๋ ๋ค์ ๋ ๊ฐ์ง๋ก ๋๋๋ค.
- ์๋ก์ด ๋ฌผ๊ฑด์ ๋ฃ์ง ์๋๋ค
- ์๋ก์ด ๋ฌผ๊ฑด์ ๋ฃ๊ธฐ ์ํด ํ์ฌ ๋ฌผ๊ฑด์ ๋ฃ์ ๊ณต๊ฐ์ ๋ง๋ค์ด์ ๋ฌผ๊ฑด์ ๋ฃ๋๋ค.
์ฐ๋ฆฌ๋ ์ต๋ ๊ฐ์น๋ฅผ ์ํ๊ธฐ ๋๋ฌธ์, ๋ ๊ฒฝ์ฐ ์ค ๋ ํฐ ๊ฐ์ ์ ํํ๊ฒ ๋ ๊ฒ์ด๋ค. ์ด๊ฒ์ ์์์ผ๋ก ๋ง๋ค๋ฉด,
ํ์ฌ ๋ฌผ๊ฑด์ ๋ฃ๊ธฐ ์ํด ๋ฃ์๋ ๋ฌผ๊ฑด์ ๋บ์ ๋์ ๊ฐ์น์ ํ์ฌ ๋ฌผ๊ฑด์ ๊ฐ์น๋ฅผ ๋ํด์ฃผ๋ฉด ๋๋ค.
ํ๋ฅผ ์ฑ์๊ฐ๋ฉด์ ๋ ์์ธํ๊ฒ ์๊ฐํด๋ณด์. ์ฐ๋ฆฌ์๊ฒ ๋ค ๊ฐ์ ๋ฌผ๊ฑด์ด ์๋ค๊ณ ํ์ ๋ฌผ๊ฑด์ (๋ฌด๊ฒ, ๊ฐ์น) ๋ก ๋ํ๋ด๊ฒ ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฌผ๊ฑด์ ๋ฃ์ ๊ฐ๋ฐฉ์ ์ต๋ ๋ฌด๊ฒ๋ 5๋ผ๊ณ ํ์.
๊ฐ๋ฐฉ์ ์ต๋ ๋ฌด๊ฒ: 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) ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
'๐ฎ ์จ-์์ค > ๐ ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ๊น์ด ์ฐ์ ํ์(DFS) (0) | 2021.07.18 |
---|---|
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ๋๋น ์ฐ์ ํ์(BFS) (0) | 2021.07.18 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ํํ๋ง ์ฝ๋(Huffman Code Problem) (0) | 2021.07.17 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ(Greedy Alogorithm) (0) | 2021.07.17 |
[์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ] ์ต์ฅ ๊ณตํต ๋ถ๋ถ ์์ด(LCS) (0) | 2021.07.17 |
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote