0-1 ๋ฐฐ๋ญ ๋ฌธ์
๐ซ 0-1 ๋ฐฐ๋ญ ๋ฌธ์
๋ฐฐ๋ญ์ ์ด๋ค ๋ฌผ๊ฑด์ ๋ด์์ผ ์ต๋ ์ด์ต์ ๋ผ ์ ์๋์ง ์์๋ด๋ ๋ฌธ์ .
๊ฐ ๋ฌผ๊ฑด์ ํต์งธ๋ก ๋ฃ๊ฑฐ๋ ์์ ์ ๋ฃ๊ฑฐ๋ ํ์ผํด์ผ ํ๋ค๋ ์กฐ๊ฑด์ด ์์ ๋, ๋ฐฐ๋ญ์ ์ฉ๋์ ๋์ง ์์ผ๋ฉด์ ๋ฐฐ๋ญ์ ๋ด์ ์ ์๋ ๋ฌผ๊ฑด๋ค์ ์ต๋ ์ด์ต์ด ์ผ๋ง์ธ์ง(์ ํํ๊ฒ๋ ์ต๋ ์ด์ต์ ์ป์ด๋ด๊ธฐ ์ํด ์ด๋ค ๋ฌผ๊ฑด์ ๋ด์์ผ ํ๋์ง) ์์๋ด๋ ๋ฌธ์
- ์์ฌ์์ด ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์์
- DC์ DP๋ฅผ ์ด์ฉํ์ฌ ํด๊ฒฐ
์ต์ ํ ๋ฌธ์
@ TODO: Tex ๊ดํธ
- n๊ฐ์ ๋ฌผ๊ฑด $ S = { Object_1, โฆ, Object_n } $
- ๊ฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ $ W = { w_1, โฆ, w_n } where\ w_i > 0 $
- ๊ฐ ๋ฌผ๊ฑด์ ์ด์ต $ P = { p_1, โฆ, p_n } where\ p_i > 0 $
- ๊ฐ ๋ฌผ๊ฑด์ด ๋ฐฐ๋ญ์ ๋ฃ์ด์ง๋ ๋ถ๋ถ $ X = { x_1, โฆ x_i } where\ x_i = 0 or 1 $
- ๋ฐฐ๋ญ์ ์ฉ๋ $ M > 0 $
- ์ต์ ํด $ K(n, M) $ ์ $ \sum_{i = 1}^n p_i x_i $ ์ ์ต๋๊ฐ. ๋จ. $ \sum_{i = 1}^n w_i x_i \le M $
๐ซ Solve By Dynamic-Programming
๋ฌผ๊ฑด์ ๋ฌด๊ฒ์ ์์ ์ค์๋ฅผ ํ์ฉํ๋ค๋ฉด DP๋ฅผ ์ด์ฉํ๋๋ฐ ์ด๋ ค์์ด ์์ (why??)
- ๋ฌด์์ ๊ธฐ๋ฒ
- ๊ฐ๋ฅํ ๋ชจ๋ ๋ฌผ๊ฑด์ ์กฐํฉ(2n๊ฐ)์ ๊ตฌํ๊ณ
- ๋ฐฐ๋ญ์ ์ฉ๋์ ์ด๊ณผํ๋ ์กฐํฉ์ ๋ชจ๋ ์ ์ธํ ๋ค์
- ๋จ์ ์กฐํฉ๋ค ๊ฐ์ด๋ฐ ์ด์ต์ด ์ต๋์ธ ๊ฒ์ ์ฐพ์
- ์ต์ ๋ถ๋ถ๊ตฌ์กฐ
- ๋ฐฐ๋ญ ์ฉ๋ $ = M $ ์ด๊ณ ์ต์ ํด $ = K(n, M) $ ์ผ ๋, ์ต์ ํด ์ํ์ ๋ฐฐ๋ญ์ ๊ด์ฐฐ
- $ object_n $ ์ด ๋ฐฐ๋ญ์ ์๋ค : ์ ์ด์ $ object_n $ ์ด ์๋ ์ํ์์ ๋ฌธ์ ๋ฅผ ํ์ด๋ ๊ฐ์ ๊ฒฐ๊ณผ.
- ์ฆ, $ K(n, M) = K(n - 1, M) $
- $ object_n $ ์ด ๋ฐฐ๋ญ์ ์๋ค : ๋ฐฐ๋ญ์ $ object_n $ ์ ๋ฏธ๋ฆฌ ๋ฃ์ด๋ ์ํ์ ์ต์ ํด์ ๋์ผ.
- ์ฆ, $ K(n, M) = K(n - 1, M - w_n) + p_n $
- โด ์ต์ ๋ถ๋ถ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง
- $ object_n $ ์ด ๋ฐฐ๋ญ์ ์๋ค : ์ ์ด์ $ object_n $ ์ด ์๋ ์ํ์์ ๋ฌธ์ ๋ฅผ ํ์ด๋ ๊ฐ์ ๊ฒฐ๊ณผ.
- ๋ ์กฐ๊ฑด์ ๋ฐ๋ฅธ ๋ถ๋ฌธ์ ์ ์ต์ ํด๋ฅผ ์ด์ฉํ๋ฉด ์๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ๊ฐ๋ฅ
- i.e. $ M = 30, W = {5, 10, 25}, P = {150, 150, 200} $์ด ์ฃผ์ด์ก์ ๋ ์ต์ ํด $ K(3, 30) $ ?
- โ 3๋ฒ์งธ ๋ฌผ๊ฑด์ด ์ต์ ํด์ ๋ฐฐ๋ญ์ ํฌํจ๋์ง ์๋๋ค๋ ๊ฐ์ ํ์ ์ต์ ํด์ธ $ K(2, 30) $ ๊ณผ 3๋ฒ์งธ ๋ฌผ๊ฑด์ด ์ต์ ํด์ ๋ฐฐ๋ญ์ ํฌํจ๋๋ค๋ ๊ฐ์ ํ์ ์ต์ ํด์ธ $ K(2, 5) + 200 $ ๊ฐ์ด๋ฐ ๋ ํฐ ๊ฐ
- i.e. $ M = 30, W = {5, 10, 25}, P = {150, 150, 200} $์ด ์ฃผ์ด์ก์ ๋ ์ต์ ํด $ K(3, 30) $ ?
- ๋ถ๋ฌธ์ ๋ฅผ ์ ์ํ๋ ํ์
- ์ฐ์๋ ํ๋ ฌ ๊ณฑ์
, ์ต์ ์ด์ง ํ์ ํธ๋ฆฌ์ ๋ถ๋ฌธ์ ๋ ์์๊ณผ ๋์ด ๋งค์ฐ ์ค์
- i.e. ๋ถ๋ฌธ์ $ M_i โฆ M_j $ ์์ ์กฐ๊ธ์ฉ $ i $ ์ $ j $์ ์ฐจ๋ฅผ ๋๋ ค ์ต์ข ์ ์ผ๋ก $ M_1 โฆ M_n $์ ์ต์ ํด๋ฅผ ๊ตฌํจ
- ๋์ ๊ฑฐ์ค๋ฆ๋ ๋ฌธ์ , 0-1 ๋ฐฐ๋ญ ๋ฌธ์ ๋ ๋ถ๋ฌธ์ ์ ํ์ชฝ ๊ฒฝ๊ณ๋ ์ธ์ ๋ ์ผ์
- i.e. ๋ถ๋ฌธ์ $ { object_1 , โฆ , object_i } $์์ ์กฐ๊ธ์ฉ $ i $ ๋ฅผ ๋๋ ค ์ต์ข ์ ์ผ๋ก $ { object_1, โฆ , object_n } $ ์ ๋ํ ์ต์ ํด๋ฅผ ๊ตฌํจ
- ๋ถ๋ฌธ์ ๊ฐ ํญ์ $ K(1, j, m) $ ์ผ๋ก ์ ์๋๊ธฐ ๋๋ฌธ์ ์์ ๋ถ๋ถ์ ์ ์ธํ $ K(n, M) $ ์ผ๋ก๋ ์ถฉ๋ถ
- ์ฐ์๋ ํ๋ ฌ ๊ณฑ์
, ์ต์ ์ด์ง ํ์ ํธ๋ฆฌ์ ๋ถ๋ฌธ์ ๋ ์์๊ณผ ๋์ด ๋งค์ฐ ์ค์
- ๋ฐฐ๋ญ ์ฉ๋ $ = M $ ์ด๊ณ ์ต์ ํด $ = K(n, M) $ ์ผ ๋, ์ต์ ํด ์ํ์ ๋ฐฐ๋ญ์ ๊ด์ฐฐ
@ KP_A
- ๋ฌธ์ ์ ์ํ์ ์ ์
- ์ต์ข ๋ชฉํ: ์ต๋ ์ด์ต์ ๊ฐ์ ธ๋ค ์ฃผ๋ ๋ฌผ๊ฑด์ ์กฐํฉ
- ์ต์ฐ์ ๋ชฉํ: ์ต๋ ์ด์ต
- $ n $ ๊ฐ์ ๋ฌผ๊ฑด์ด ์ฃผ์ด์ง๊ณ ๋ฐฐ๋ญ ์ฉ๋์ด $ M $ ์ธ 0-1 ๋ฐฐ๋ญ ๋ฌธ์ ์ ์ต์ ํด $ K(n, M) $
- $ object_n $์ด ๋ฐฐ๋ญ์ ํฌํจ๋์ง ์๋๋ค๋ ๊ฐ์ ํ์ ์ต์ ํด์ ํฌํจ๋๋ค๋ ๊ฐ์ ํ์ ์ต์ ํด ์ค ๋ ํฐ ๊ฐ
- $ K(n, M) = Max { K(n - 1, M), K(n - 1, M - w_n) + p_n } $
- $ n $ ๊ฐ์ ๋ฌผ๊ฑด์ด ์ฃผ์ด์ง๊ณ ๋ฐฐ๋ญ ์ฉ๋์ด $ M $ ์ธ 0-1 ๋ฐฐ๋ญ ๋ฌธ์ ์ ์ต์ ํด $ K(n, M) $
- ์ผ๋ฐํ
- $ i $ ๊ฐ์ ๋ฌผ๊ฑด์ด ์ฃผ์ด์ง๊ณ ๋ฐฐ๋ญ ์ฉ๋์ด $ w $ ์ธ 0-1 ๋ฐฐ๋ญ ๋ฌธ์ ์ ์ต์ ํด $ K(i, w) $
- $ object_i $ ๊ฐ ๋ฐฐ๋ญ์ ํฌํจ๋์ง ์๋๋ค๋ ๊ฐ์ ํ์ ์ต์ ํด์ ํฌํจ๋๋ค๋ ๊ฐ์ ํ์ ์ต์ ํด ์ค ๋ ํฐ ๊ฐ
- ๋ฌผ๊ฑด์ด ์๊ฑฐ๋ ๋ฐฐ๋ญ ์ฉ๋์ด 0 โ ์ต์ ํด๊ฐ 0
- $ object_i $ ์ ๋ฌด๊ฒ๊ฐ ๋ฐฐ๋ญ์ ์ฉ๋์ ๋์ด์๋ ์ํฉ โ $ object_i $๊ฐ ์ต์ ํด์ ๋ฐฐ๋ญ์ ํฌํจ๋์ง ์์ ๊ฒฝ์ฐ๋ง ๊ณ ๋ ค
- $ i $ ๊ฐ์ ๋ฌผ๊ฑด์ด ์ฃผ์ด์ง๊ณ ๋ฐฐ๋ญ ์ฉ๋์ด $ w $ ์ธ 0-1 ๋ฐฐ๋ญ ๋ฌธ์ ์ ์ต์ ํด $ K(i, w) $
1
2
3
4
5
6
7
8
9
10
11
// w[]์ p[]๋ ๊ฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ์ ์ด์ต์ ๋ด์ ๋ฐฐ์ด
int DC_01_ks(int i, int w)
{
if (i == 0 || w == 0)
return 0;
if (w < W[i])
return DC_01_ks(i - 1, w);
return Math.Max(DC_01_ks(i - 1, w), DC_01_ks(i - 1, w - W[i]) + P[i]);
}
- ์ค์ฒฉ๋ ๋ถ๋ฌธ์ ์ DC
- ๋ณต์ก๋ โ ํธ๋ฆฌ์ ์๋ ๋
ธ๋ ์ = ์ต๋ $ \sum_{l = 1}^n 2^l $ = ์ต๋ $ 2^{2 + 1} - 1 = O(2^n) $
- ๋ฌด์์ ๊ธฐ๋ฒ $ ฦ(2^n) $ ๊ณผ ๋น์ท, but ์ค์ ๋ก ํธ์ถ๋๋ ๋ ธ๋ ์๋ ๋ณดํต ์ด๋ณด๋ค ์ ์
- ์๊ณ ๋ฆฌ๋ฌ์ ๊ฐ์ ํ๋ฉด ๋จ๋ง ๋ ธ๋ ํธ์ถ์ ์์จ ์ ์์
- ์ค์ฒฉ๋ ๋ถ๋ฌธ์ ํน์ฑ
- ๋ฌผ๊ฑด ๊ฐ์๊ฐ ๋ง์์๋ก ๋ฐฐ๋ญ ์ฉ๋์ด ์์์๋ก ๋ถ๋ฌธ์ ๊ฐ ์ค๋ณต๋ ๊ฐ๋ฅ์ฑ์ด ์ปค์ง
- ๋ณต์ก๋ โ ํธ๋ฆฌ์ ์๋ ๋
ธ๋ ์ = ์ต๋ $ \sum_{l = 1}^n 2^l $ = ์ต๋ $ 2^{2 + 1} - 1 = O(2^n) $
@ KP_B
@ ๊ฐ๋ฐฉ ๊ณต๊ฐ์ด ์ ์ด์ ๊ณ์ฐํ์ง ์๋, ๋ถ๋ฌธ์ ๊ฐ ํ๋ ๋ฐ์ ์๋ ์ผ์ด์ค๊ฐ ์๊ธธ ์ ์์
DP๋ก ํ๊ธฐ : ํจ์ ๋์ ๋ฐฐ์ด๋ก
๐ซง DP 1 - ์๊ณ ๋ฆฌ๋ฌ
- ์ต์ฐ์ ๋ชฉํ: $ n $ ๊ฐ์ ๋ฌผ๊ฑด๊ณผ ๋ฐฐ๋ญ ์ฉ๋์ด $ M $ ์ธ 0-1 ๋ฐฐ๋ญ ๋ฌธ์ ์ ์ต๋ ์ด์ต $ K(n, M) $
- 2์ฐจ์ ๋ฐฐ์ด์ ์์ $ K[i][w] $ ์ $ K(i, w) $์ ๊ฐ์ ์ ์ฅํ๊ณ ํ์ํ ๋๋ง๋ค ์ฌ์ฌ์ฉ
- 1์ฐจ์ ๋ฐฐ์ด์ ์์ $ P[i] $ ๊ณผ $ W[i] $ ์ ๊ฐ๊ฐ $ object_i $ ์ ์ด์ต๊ณผ ๋ฌด๊ฒ๊ฐ ์ ์ฅ
@ KP_C
@ KP_D
@ ๋ฐฐ์ด B๊ฐ ๋ฐ๋์ ์์ด์ผ ํ๋? ์์ด๋๋จ ๊ทผ๋ฐ ์ผ๋จ ํ๋๋ฐ๋ก ๊ณ์ฐํ๋ ค๊ณ
๐ซง DP 1 - ๊ตฌํ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// W[ ]์ P[ ]๋ ๊ฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ์ ์ด์ต์ ๋ด์ ๋ฐฐ์ด
int _01_ks_DP(int n, int M)
{
int[][] K = new int[MAX][MAX];
for (int w = 0; w <= M; w++)
K[0][w] = 0;
for (int i = 0; i <= n; i++)
K[i][0] = 0;
for (int i = 1; i <= n; i++)
{
for (int w = 1; w <= M; w++)
{
if (w < W[i])
K[i][w] = K[i - 1][w];
else
K[i][w] = Math.Max(K[i - 1][w], K[i - 1][w - W[i]] + P[i]);
}
}
return K[n][M];
}
๐ซง DP 1 - ๋ถ์
- ๋ณต์ก๋: $ ฦ(nM) $ vs. DC์ ๋ณต์ก๋ $ O(2^n) $
- ์ด๋ ์ชฝ์ ์ฑ๋ฅ์ด ๋ ์ข์๊ฐ? : โ์ ์ ์๋คโ
- M์ ๊ฐ์ด ๋งค์ฐ ํฌ๋ฉด DC์ ์ฑ๋ฅ์ด ๋ ๋์ ์๋ ์์
- ์) $ M = O(n!) $ ์ด๋ฉด DP 1์ $ O(n!) $
- ์ด๋ ์ชฝ์ ์ฑ๋ฅ์ด ๋ ์ข์๊ฐ? : โ์ ์ ์๋คโ
๐ซง DP 2 - ์๊ณ ๋ฆฌ๋ฌ
- DP 1์ M์ด n์ ๋นํด ํฐ ๊ฒฝ์ฐ ์ฌ์ฌ์ฉ๋์ง ์์ ๊ณ์ฐ์ ๋๋ฌด ๋ง์ด ํ๋ค. ์ค์ ๋ก ๊ผญ ํ์ํ ๋ฐฐ์ด ์์๋ง ๊ณ์ฐํ ์๋ง ์๋ค๋ฉด!!
- $ K[i][w] $ ๋ฅผ ๊ณ์ฐํ๋๋ฐ $ K[i - 1][w] $ ์ $ K[i - 1][w - W[i]] $ ๋ผ๋ ์ด์ ํ์ ๋ ๊ฐ๋ง ํ์
- โด ๊ณ์ฐ๋ ๋ฐฐ์ด ์์๋ค์ ํ์ธํ ํ ๊ผญ ํ์ํ ์์๋ง ๊ณ์ฐ
@ KP_E
๐ซง DP 2 - ๋ถ์
- ๊ฐ์ ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ณต์ก๋
- ์ค์ ๊ณ์ฐ๋๋ ๋ฐฐ์ด ์์์ ์์ ๋น๋ก
- $ K(n, M) $ ์ ๊ตฌํ๊ธฐ ์ํด ๊ณ์ฐํ๋ ๋ฐฐ์ด ์์์ ์๋ ํ์ ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ๋ฉฐ ์ต๋ 2๋ฐฐ์ฉ ๋์ด๋๋ค๊ณ ํ ๋ $ \sum_{l = 1}^n 2^{l - 1} = 2^n - 1 $๊ฐ: ์ต์ ์ ๊ฒฝ์ฐ $ ฦ(2^n) $
- ๊ทธ๋ฌ๋, ์ ์ฅ๋๋ ์์๊ฐฏ์๋ ๋ฐฐ์ด ์์๊ฐฏ์๋ณด๋ค ๋ง์ ์ ์์
- KP_F์์ ์น ํด์ง ์์๋ค์ด ๊ณ์ฐ ๋์์ด๋ผ ํ๋ค๋ฉด ๊ทธ ์ซ์๋ $ ฦ(nM) $
- ๋ชจ๋ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๊ฐ 1์ด๊ณ n โ M์ผ ๊ฒฝ์ฐ์ ํด๋น
- ๋ ๊ฐ์ง ๊ด์ ์ค ์ ๋ฆฌํ ๊ฑธ๋ก ์๊ฐํ๋ฉด ๋๋ฏ๋ก $ O(minimum(2^n, nM)) $
- ์ค์ ๊ณ์ฐ๋๋ ๋ฐฐ์ด ์์์ ์์ ๋น๋ก
@ KP_F
๐ซง DP 3 - ์๊ณ ๋ฆฌ๋ฌ
- ์ง๊ธ๊น์ง ์ดํด๋ณธ DP ์๊ณ ๋ฆฌ์ฆ์ ๋ฌผ๊ฑด ๋ฌด๊ฒ๋ ๋ฐฐ๋ญ ์ฉ๋์ด ์ค์์ธ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ ๋ถ๊ฐ
- โ์์น์ ์ถฉ์คํ์โ
- ์ด์ฐ ์ ๋ณด์ธ ์ ์ ๋์ ์ฐ์ ์ ๋ณด์ธ ์ค์๋ฅผ ์ฒ๋ฆฌํ๋๋ก ๊ฐ์
- ์ด์ฐ ์ ๋ณด๋ฅผ ํํํ๋ ๋๊ตฌ์ธ ๋ฐฐ์ด ๋์ ์ฐ์ ์ ๋ณด๋ฅผ ํํํ๋ ๋๊ตฌ์ธ ํจ์์ ์ด์
- โ์์น์ ์ถฉ์คํ์โ
- ํจ์ $ K(i, w) $ ์ ์ํ ์ ์(revisited)
- @ KP_G
- ์ ๋ ฅ์ผ๋ก ๋ฌผ๊ฑด๊ณผ ๋ฐฐ๋ญ ๋ฌด๊ฒ๊ฐ ์ฃผ์ด์ง๋ฉด ์ ์ผํ ์ถ๋ ฅ๊ฐ์ผ๋ก ์ต๋ ์ด์ต์ ์์ฑ
- ์ด๋ค ๋ชจ์ต์ ๊ทธ๋ํ? : ์ ๋ ฅ ๋ณ์๊ฐ ๋์ด๋ฏ๋ก 3์ฐจ์ ๊ทธ๋ํ๋ก ๋ํ๋ด์ด์ผ ํจ
- ์ดํดํ๊ธฐ ์ฝ๋๋ก $ K(i, w) $ ๋ฅผ ์ฌ๋ฌ 2์ฐจ์ ํจ์๋ก ์ชผ๊ฐ๋ณด์
- $ i $ ๋ ์ ์, $ w $ ๋ ์ค์์ด๋ฏ๋ก ๊ฐ $ i $ ์ ๋ํด ์๋ก ๋ค๋ฅธ ํจ์ $ K_i(w) $ ๋ฅผ ์ ์ํ๋ ๊ฒ์ด ํ๋น
- $ K_i(w): { object_1, โฆ, object_i } $ ์ ๋ํด $ x $ ์ถ์ ๋ฐฐ๋ญ ๋ฌด๊ฒ๋ฅผ, $ y $ ์ถ์ ์ต๋ ์ด์ต์ ๋ํ๋ด๋ ํจ์
- $ K_0(w), K_1(w), โฆ, K_i(w), โฆ, K_n(w) $ ๋ฅผ ์ ์ํ๋ ๊ฒ์ด ๊ฐ๋ฅ
- $ K_n(w) $ ๋ฅผ ๊ตฌํ ์ ์๋ค๋ฉด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ์ต์ ํด์ธ $ K_n(M) $ ์ ๊ฐ์ ๊ณ์ฐ ๊ฐ๋ฅ
- 0-1 ๋ฐฐ๋ญ ๋ฌธ์ ์ ์ํ ์ ์ ํจ์ $ K(i, w) $ ๋ฅผ ํจ์ $ K_i(w) $ ๋ก ์ฌ์ ์
- @ KP_H
- $ K_0(w) = 0 $
- ํจ์ $ K_{i - 1}(w - w_i) + p_i $ ๋ $ K_{i - 1}(w) $ ๋ฅผ $ x $ ์ถ์ผ๋ก $ w_i $ ๋งํผ, $ y $ ์ถ์ผ๋ก $ p_i $ ๋งํผ ํํ ์ด๋ํ ๊ฒ
- ์กฐ๊ฑด์ ๋ฐ๋ผ $ K_{i - 1}(w - w_i) + p_i $ ๊ณผ $ K_{i - 1}(w) $ ๋ฅผ ํ๋๋ก ํฉ์น๋ฉด $ K_i(w) $ ๋ฅผ ๊ตฌํ ์ ์์
- โ ์ํ์ ๊ท๋ฉ๋ฒ์ ์ํด $ K_n(w) $ ๋ฅผ ์ ๋ ๊ฐ๋ฅ
- $ K_0(w) = 0 $ ์ด๋ค. ์ด๋ฅผ ํํ ์ด๋ํ์ฌ $ K_0(w - w_1) + p_1 $ ๋ฅผ ๊ตฌํ ํ $ K_1(w) $ ๋ฅผ ์ป๋๋ค.
- $ K_1(w) $ ๋ฅผ ํํ ์ด๋ํ์ฌ $ K_1(w - w_2) + p_2 $ ๋ฅผ ๊ตฌํ ํ $ K_2(w) $ ๋ฅผ ์ป๋๋ค.
- โฆ
- $ K_{i - 1}(w) $ ๋ฅผ ํํ ์ด๋ํ์ฌ $ K_{i - 1}(w - w_i) + p_i $ ๋ฅผ ๊ตฌํ ํ $ K_i(w) $ ๋ฅผ ์ป๋๋ค.
- โฆ
- $ K_{n - 1}(w) $ ๋ฅผ ํํ ์ด๋ํ์ฌ $ K_{n - 1}(w - w_n) + p_n $ ์ ๊ตฌํ ํ $ K_{n}(w) $ ๋ฅผ ์ป๋๋ค.
@ U ๊ธฐ๋ง๊ณ ์ฌ ์ถ์ ์์ : y์ถ ํํ ์ด๋์ผ๋ก ๊ตฌํ๋ ๋ฐฉ๋ฒ
@ KP_I
- ์๊ณ ๋ฆฌ์ฆ
- ์ ๊ทผ ๋ฐฉ๋ฒ: โ์์น์ ์ถฉ์คํ์โ
- ์ฐ์ ์ ๋ณด๋ฅผ ํํํ๋ ๋๊ตฌ์ธ ํจ์๋ฅผ ์ด์ฐ ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ํํ
- ๊ฐ $ K_i(w) $ ํจ์์ ๊ทธ๋ํ๋ ๊ตฌ๊ฐ์์๋ง ์ฐ์์ธ ๊ณ๋จ์์ ํํ
- ๋ฐ๋ผ์ ๊ฐ ๊ตฌ๊ฐ์ ์์์ ์ขํ๋ฅผ ์์ ๋ฆฌ์คํธ๋ก ๊ด๋ฆฌ
- ์) [๊ทธ๋ฆผ 4.15]์ (d)๋ ๊ตฌ๊ฐ์ด 2๊ฐ์ด๋ฏ๋ก ์์์ ์์ ๋ฆฌ์คํธ $ {(5, 4), (8, 5)} $
- ํต์ฌ ์์ด๋์ด: โ $ K_{i - 1}(w) $ ๋ฅผ ํํ ์ด๋ํ์ฌ $ K_{i - 1}(w - w_i) + p_i $ ๋ฅผ ๊ตฌํ ํ $ K_i(w) $ ๋ฅผ ์ป๋๋ค.โ
- $ S_{i - 1} : K_{i - 1}(w) $ ์ ์์์ ๋ฆฌ์คํธ, $ SP_{i - 1} : K_{i - 1}(w - w_i) + p_i $ ์ ์์์ ๋ฆฌ์คํธ
- ๋ชฉํ: $ S_0 $ ์์๋ถํฐ ์ถ๋ฐํ์ฌ $ S_n $ ์ ๊ตฌํ๋ ๊ฒ
- 1) $ K_{i - 1}(w) $ ๋ฅผ ํํ ์ด๋ํ์ฌ $ K_{i - 1}(w - w_i) + p_i $ ๋ฅผ ๊ตฌํ๋ ค๋ฉด $ S _{i - 1} $ ์ ๊ฐ ์ขํ์ $ (w_i, p_i) $ ๋ฅผ ๋ํจ
- 2) $ K_{i - 1}(w) $ ๊ณผ $ K_{i - 1}(w - w_i) + p_i $ ๋ฅผ ์ด์ฉํ์ฌ $ K_i(w) $ ๋ฅผ ์ป์ผ๋ ค๋ฉด $ S_{i - 1} $ ์ $ SP_{i - 1} $ ๋ฅผ ํฉ๋ณํ์ฌ $ S_i $ ์์ฑ
- ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๋ ฌ๋ ๋ฆฌ์คํธ๋ฅผ ํ๋๋ก ํฉ์น๋ ์์
- ๋จ ํฉ๋ณ ์ ๋ ์์ (x1, y1), (x2, y2)์ฌ์ด์ x1 โฅx2์ด๊ณ y1 โค y2์ธ ๊ด๊ณ๋ผ๋ฉด (x1, y1) ์ ๊ฑฐ
@ KP_J
๊ฐ ํจ์๋ ์ ๋ ฌ๋ ์ ์ ๋ฆฌ์คํธ
์๋๋ ์ต๋ํ ๋ง์ ์ ์ ๊ธฐ์ตํด์ ์๋ ํจ์์ ๋ชจ์ต์ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ข์๋ฐ, ๊ฒ๋จ์ ๊ทธ๋ํ๋ฅผ ๊ฐ์ง๋ ์ด๋ฐ ์ํฉ์์๋ ๋จ์ํ ์ ๋ช ๊ฐ ๋ง์ ๊ธฐ์ตํ๊ณ ๋ x์ ๋ํ y ๊ฐ์ ์์๋ผ ์ ์์
๊ฐ ๋ฌผ๊ฑด์ ๋ํด์๋, ๊ฐ ํจ์์ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ์ ๊ฐ์น๋ฅผ ํํ์ด๋ํ ๊ฒ์ผ๋ก
๊ทธ๋ฆฌ๊ณ ์ด์ ํจ์์ ํํ ์ด๋ํ ํจ์๋ฅผ ํ๋์ ๋ฆฌ์คํธ๋ก ํฉ์น๋ค, ๋ ๋ฆฌ์คํธ๋ ์ ๋ ฌ๋์ด์๋ค (๊ณ๋จ์) (์ ๋ ฌ๋ ๋ ๋ฆฌ์คํธ๋ฅผ ํ๋๋ก ํฉํ๊ธฐ? => ํฉ๋ณ ์ ๋ ฌ)
๊ฐ x์ y๊ฐ์ ๋น๊ต,
์ขํ A์ B์ ๋ํด, x y๊ฐ ๋ ๋ค ์์ ์ขํ๊ฐ ๊ทธ๋ํ์ ๊ทธ๋ ค์ง๊ณ ,
x๋ y ์ค ํ๋๋ง ์์ ๊ฒฝ์ฐ์๋, A์ B ์ค x๊ฐ ๋ ํฐ ์ชฝ์ ์ ๋ ฌ๊ณผ์ ์์ ์ ์ธ๊ฐ ๋๋ค (์๋ํ๋ฉด x๊ฐ ๋ ์์ ์ชฝ์ด ๊ทธ x๋ณด๋ค ํฐ ๊ฐ๋ ์ค๋ช
ํ ์ ์์ผ๋๊น)
$ S_0 $, ํํ์ด๋ $ SP_0 $,
ํฉ์น๊ณ $ S_1 $, ํํ์ด๋ $ SP_1 $,
๐ซ Solve By BackTracking
- $ p_i/w_i > p_{i + 1}/w_{i + 1} $
BT์์๋ ์์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ ์กฐ๊ฑด์ด ๋ถ์
Backtracking ์ต์ ํ ๋ฌธ์ ํด๊ฒฐ์ ์ํ ๊ตฌ์กฐ (๋งํฌ ์ฐธ๊ณ )
๐ซง ์ํ ๊ณต๊ฐ ํธ๋ฆฌ
- ์ฃผ์ ๋ณ์
weight
= ํ์ฌ๊น์ง ๋ด์ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ ํฉprofit
= ํ์ฌ๊น์ง ๋ด์ ๋ฌผ๊ฑด์ ์ด์ต ํฉmax_profit
(optimal) = ํ์ฌ๊น์ง์ ์ต์ ํด ์ฆ ํ์ฌ๊น์ง์ ์ต๋ ์ด์ต
- ์ต์ ํด๋ฅผ ๋ณ๊ฒฝํ๋ ์กฐ๊ฑด
- ๋ฐฐ๋ญ์ ๋ฌผ๊ฑด์ ๋ฃ์ด์ผ ํ๋ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ โ
weight
์profit
์ ๊ฐ์ด ์ฆ๊ฐ - ๋ฐฐ๋ญ์ ์ฉ๋์ ๋์ด์์ง ์์ผ๋ฉด์ ์ง๊ธ๊น์ง์ ์ต๋ ์ด์ต๋ณด๋ค ํฐ ์ด์ต์ด ๋ฐ์ํ๋ฉด
max_profit
๊ฐ์ ๋ณ๊ฒฝ๋profit
๊ฐ์ผ๋ก ๋ฐ๋์ด์ผ ํจ - ๋ฐ๋ผ์ ๋ค์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ์ต์ ํด๊ฐ ๋ณ๊ฒฝ
- $ (weight \le M) ^(and) (profit > max\ profit) $
- ๋ฐฐ๋ญ์ ๋ฌผ๊ฑด์ ๋ฃ์ด์ผ ํ๋ ๋
ธ๋๋ฅผ ๋ฐฉ๋ฌธ โ
@ TODO: and ๊ธฐํธ
๐ซง BT - ์๊ณ ๋ฆฌ๋ฌ
- ์ ๋งํ์ง ์์ ๋
ธ๋์ ํ๋ณ(ํ์ฌ i๋ฒ์งธ ๋ฌผ๊ฑด๊น์ง ๊ฒฐ์ ๋ ์ํ)
- ๊ท์น 1) ๋ ์ด์ ๋ฌผ๊ฑด์ ๋ด์ ์ ์๋ ๊ฒฝ์ฐ, $ weight \ge M $
- ๊ท์น 2) ์์ง์ ๋ฐฐ๋ญ์ ์ฌ์ ๊ฐ ์์ง๋ง ํ ์ํ์์ ์ด๋ป๊ฒ ์งํํ๋๋ผ๋ ํ์ฌ๊น์ง์ ์ต๋ ์ด์ต๋ณด๋ค ๋ ํฐ ์ด์ต์ ๊ธฐ๋ํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ(ํ์ฌ๊น์ง ๋ด์ ๋ฌผ๊ฑด์ ์ด์ต์๋ค๊ฐ ๋จ์์๋ ๋ฌผ๊ฑด๋ค์ ์ต์ ์ผ๋ก ์ถ๊ฐํ์ฌ ์ป์ ์ ์๋ ์ด์ต์ ํฉํ๋ค ํ๋๋ผ๋ ํ์ฌ๊น์ง์ ์ต๋ ์ด์ต์ ๋ฅ๊ฐํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ)
- ๋ถ๋ถ ๋ฐฐ๋ญ ๋ฌธ์ ๋ก ํ์์ ๋์ ์ต๋ ์ด์ต >= 0-1 ๋ฐฐ๋ญ ๋ฌธ์ ๋ก ํ์์ ๋์ ์ต๋ ์ด์ต
- โด ์ต๋ ์ด์ต์ ์ํ์ ๊ตฌํ๊ธฐ ์ํด ๋ถ๋ถ ๋ฐฐ๋ญ ๋ฌธ์ ๋ก ๋ณ์
- ํ์ฌ๊น์ง ๋ด์ ๋ฌผ๊ฑด์ ์ด์ต($ profit $) + ๋จ์ ๋ฌผ๊ฑด์ ๋์์ผ๋ก ๋ถ๋ถ ๋ฐฐ๋ญ ๋ฌธ์ ๋ก ์ ํํ์ฌ ํ์์ ๋์ ์ต๋ ์ด์ต($ exp\ profit $)์ด ํ์ฌ๊น์ง์ ์ต๋ ์ด์ต($max\ profit$)๋ณด๋ค ์๋ค๋ฉด ์ ๋๋ก ์ ๋งํ ์๊ฐ ์์ โ ์ฒ์์ ๋ฌผ๊ฑด์ ๋จ์ ๋ฌด๊ฒ ๋น ์ด์ต์ ์์ ๋ฐ๋ผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ์ด์
- $ profit + exp\ profit \ge max\ profit $
- @ ๋ฐฐ๋ญ 0001
- ๋ถ๋ถ ๋ฐฐ๋ญ ๋ฌธ์ ๋ก ํ์์ ๋์ ์ต๋ ์ด์ต >= 0-1 ๋ฐฐ๋ญ ๋ฌธ์ ๋ก ํ์์ ๋์ ์ต๋ ์ด์ต
@ KP_0000
@ KP_0001
Back-Tracking, ์ค์ ๋ก ํธ๋ฆฌ๋ฅผ ๋ง๋ค์ง๋ ์๊ณ , ๊ฐ ๋ ๋ฒจ์ ํด๋นํ๋ ์ํ ์ ๋ณด๋ฅผ ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
- ๋ฐฐ์ด์ ์ด์ฉํ์ฌ ์ํ ๊ณต๊ฐ ํธ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ
- ๋ถ๋ถ ์งํฉ์ ํฉ ๋ฌธ์ ์ ๋์ผ
- ๊ธฐ์ตํด์ผ ํ ์ ๋ณด๋ โ๊ฑธ์ด์จ ๊ธธโ
- ๋ ๋ฒจ i ๋
ธ๋๋ i ๊ฐ ๋ฌผ๊ฑด๊ฐ์ด๋ฐ ๋ฐฐ๋ญ์ ๋ฃ์ ๋ฌผ๊ฑด๋ค์ ๊ธฐ์ตํด์ผ ํจ
- ํด๋น ๋ ธ๋๊ฐ ์ ๋งํ์ฌ ์์ ๋ ธ๋๋ก ๋ด๋ ค๊ฐ๋ค๋ฉด i+1๊ฐ ๋ฌผ๊ฑด๊ฐ์ด๋ฐ ๋ฐฐ๋ญ์ ๋ฃ์ ๋ฌผ๊ฑด๋ค์ ๊ธฐ์ต
- ์ ๋งํ์ง ์์ ๋ถ๋ชจ ๋ ธ๋๋ก ๋ฐฑํธ๋ํนํ๋ค๋ฉด i -1๊ฐ ๋ฌผ๊ฑด๊ฐ์ด๋ฐ ๋ฐฐ๋ญ์ ๋ฃ์ ๋ฌผ๊ฑด๋ค์ ๊ธฐ์ต
์ธ๋ฑ์ค | 1 | 2 | 3 | 4 |
ํฌํจ์ฌ๋ถ | false | true | true | - |
๋จ๋ง ๋ ธ๋๊ฐ ์๋ ๋ ธ๋๊ฐ ํด๋ต์ด๋ผ๋ฉด ํด๋ต ๋ ธ๋์ ๋ ๋ฒจ๊น์ง ์ ์ฅ๋ ๊ฐ๋ง์ด ์ ํจ
- ๋ฐฐ์ด ์ธ๋ฑ์ค : ๋ฌผ๊ฑด
- ๋ฐฐ์ด ๊ฐ: ๋ฌผ๊ฑด์ ํฌํจ ์ฌ๋ถ
โด n ๊ฐ์ ๊ฐ(true/false)์ ์ ์ฅํ ์ ์๋ 1์ฐจ์ ๋ฐฐ์ด์ด ํ์
๐ซง BT - ๊ตฌํ
_01_ks_BT(0,0,0)
์ ํธ์ถํจ์ผ๋ก์จ ์์
์ ์ญ ๋ณ์ max_profit
์ ์ด๊ธฐ๊ฐ์ 0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
void _01_ks_BT(int i, int profit, int weight)
{
if (weight <= M && profit > max_profit)
{
max_profit = profit; // ์ต๋ ์ด์ต์ ๋ณ๊ฒฝ
optimal = (X[1]..X[i]); // i ๊ฐ์ ๋ฌผ๊ฑด๋ค์ ํฌํจ ์ฌ๋ถ
}
if (Promising(i, profit, weight))
{
X[i + 1] = true;
_01_ks_BT(i + 1, profit + P[i + 1], weight + W[i + 1]);
X[i + 1] = false;
_01_ks_BT(i + 1, profit, weight);
}
}
bool Promising(int i, int profit, int weight)
{
int k, exp_weight = 0;
float exp_profit = 0;
// ๊ฝ ์ฐจ๊ฑฐ๋ ์ฐข์ด์ง
if (weight >= M)
return false;
for (k = i + 1; k <= n; k++)
{
if (weight + exp_weight + W[k] > M)
break;
exp_weight += W[k];
exp_profit += P[k];
}
if (k <= n)
exp_profit += (M - (weight + exp_weight)) * P[k] / W[k];
if (profit + exp_profit <= max_profit)
return false;
return true;
}
๐ซง BT - ๋ถ์
์ํ ๊ณต๊ฐ ํธ๋ฆฌ์ ๋ ธ๋ ์
\[1 + 2 + 2^2 + โฆ + 2^n = 2^{n+1} - 1\]๋ถ๋ถ์งํฉ์ ํฉ ๋ฌธ์ ์ ์ํ ๊ณต๊ฐ ํธ๋ฆฌ๊ฐ ๋์ผ
NP-์์ ๋ฌธ์ ์ค์๋ ๋น๊ต์ ๋
ธ๋์๊ฐ ์ ์ง๋ง ์ฌ์ ํ ์ง์ ๋ณต์ก๋
์ ๋งํ ๋ ธ๋ ์
- ์ ๋งํ ๋ ธ๋ ๊ฐ์๋ฅผ ๊ณ์ฐํ ์ ์์
- ๊ฐ์ ๊ฐ์์ ๋ ธ๋๋ฅผ ๊ฐ๋๋ผ๋ ๋ฐฐ๋ญ ์ฉ๋์ด๋ ๋ฌผ๊ฑด ๋ฌด๊ฒ์ ๋ฐ๋ผ ์ ๋งํ ๋ ธ๋์ ์๊ฐ ๋ฌ๋ผ์ง
- ์ต์ ํ ๋ฌธ์ โ ์ํ ๊ณต๊ฐ ํธ๋ฆฌ๋ฅผ ๋ชจ๋ ๋ค์ ธ์ผ ํจ. ๋จ์ง ํ์ํ๋ ๋ ธ๋์ ์๊ฐ ๋ฌ๋ผ์ง ๋ฟ
DP vs. ๋ฐฑํธ๋ํน
- Horowitz์ Sahni์ ๋ช
์ โFundamentals of Computer Algorithmsโ์๋ Venkatesh๊ฐ ์ค์ ์ปดํจํฐ์์์ ์คํ์์ผ ๋ณธ ๊ฒฐ๊ณผ๊ฐ ์๋ก: ๋ค์ 4๊ฐ์ง ๊ฒฝ์ฐ์ ๋ฐ์ดํฐ ์งํฉ ์ฌ์ฉ
- โ ๊ฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ์ ์ด์ต์ 1~1,000 ๋ฒ์ ์์์ ์์๋ก ์์ฑํ ๊ฒฝ์ฐ
- โ ๊ฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ์ ์ด์ต์ 1~100 ๋ฒ์ ์์์ ์์๋ก ์์ฑํ ๊ฒฝ์ฐ
- โ ๊ฐ ๋ฌผ๊ฑด ๋ฌด๊ฒ๋ฅผ 1~100 ๋ฒ์ ์์์ ์์๋ก ์์ฑํ๊ณ ์ด์ต์ ๋ฌด๊ฒ์ 10์ ๋ํ ๊ฒฝ์ฐ
- โ ๊ฐ ๋ฌผ๊ฑด ๋ฌด๊ฒ๋ฅผ 1~100 ๋ฒ์ ์์์ ์์๋ก ์์ฑํ๊ณ ์ด์ต์ ๋ฌด๊ฒ์ 1.1์ ๊ณฑํ ๊ฒฝ์ฐ
- ๋ฐฐ๋ญ ์ฉ๋ M์ ๋ฌผ๊ฑด ๋ฌด๊ฒ์ ํฉ์ ์ ๋ฐ์ด ๋๋๋ก ํ๊ณ ๋ฌผ๊ฑด์ ๊ฐ์ n์ ๋ํด 10๊ฐ์ฉ์ ์ธ์คํด์ค์ ๋ํ ์ธก์ ๊ฐ์ ๋น๊ต โ ์ผ๋ฐ์ ์ผ๋ก ๋ฐฑํธ๋ํน ์๊ณ ๋ฆฌ์ฆ์ด DP ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ์ฐ์