ํฌ์ŠคํŠธ

0-1 ๋ฐฐ๋‚ญ ๋ฌธ์ œ

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??)

  • ๋ฌด์ž‘์œ„ ๊ธฐ๋ฒ•
    1. ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ฌผ๊ฑด์˜ ์กฐํ•ฉ(2n๊ฐœ)์„ ๊ตฌํ•˜๊ณ 
    2. ๋ฐฐ๋‚ญ์˜ ์šฉ๋Ÿ‰์„ ์ดˆ๊ณผํ•˜๋Š” ์กฐํ•ฉ์€ ๋ชจ๋‘ ์ œ์™ธํ•œ ๋‹ค์Œ
    3. ๋‚จ์€ ์กฐํ•ฉ๋“ค ๊ฐ€์šด๋ฐ ์ด์ต์ด ์ตœ๋Œ€์ธ ๊ฒƒ์„ ์ฐพ์Œ
  • ์ตœ์  ๋ถ€๋ถ„๊ตฌ์กฐ
    • ๋ฐฐ๋‚ญ ์šฉ๋Ÿ‰ $ = M $ ์ด๊ณ  ์ตœ์ ํ•ด $ = K(n, M) $ ์ผ ๋•Œ, ์ตœ์ ํ•ด ์ƒํƒœ์˜ ๋ฐฐ๋‚ญ์„ ๊ด€์ฐฐ
      1. $ object_n $ ์ด ๋ฐฐ๋‚ญ์— ์—†๋‹ค : ์• ์ดˆ์— $ object_n $ ์ด ์—†๋Š” ์ƒํƒœ์—์„œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋„ ๊ฐ™์€ ๊ฒฐ๊ณผ.
        • ์ฆ‰, $ K(n, M) = K(n - 1, M) $
      2. $ object_n $ ์ด ๋ฐฐ๋‚ญ์— ์žˆ๋‹ค : ๋ฐฐ๋‚ญ์— $ object_n $ ์„ ๋ฏธ๋ฆฌ ๋„ฃ์–ด๋‘” ์ƒํƒœ์˜ ์ตœ์ ํ•ด์™€ ๋™์ผ.
        • ์ฆ‰, $ K(n, M) = K(n - 1, M - w_n) + p_n $
      3. โˆด ์ตœ์  ๋ถ€๋ถ„๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง
    • ๋‘ ์กฐ๊ฑด์— ๋”ฐ๋ฅธ ๋ถ€๋ฌธ์ œ์˜ ์ตœ์ ํ•ด๋ฅผ ์ด์šฉํ•˜๋ฉด ์›๋ž˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ
      • 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_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) $ ์œผ๋กœ๋„ ์ถฉ๋ถ„

@ 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 } $
    • ์ผ๋ฐ˜ํ™”
      • $ i $ ๊ฐœ์˜ ๋ฌผ๊ฑด์ด ์ฃผ์–ด์ง€๊ณ  ๋ฐฐ๋‚ญ ์šฉ๋Ÿ‰์ด $ w $ ์ธ 0-1 ๋ฐฐ๋‚ญ ๋ฌธ์ œ์˜ ์ตœ์ ํ•ด $ K(i, w) $
        • $ object_i $ ๊ฐ€ ๋ฐฐ๋‚ญ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฐ€์ •ํ•˜์˜ ์ตœ์ ํ•ด์™€ ํฌํ•จ๋œ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์˜ ์ตœ์ ํ•ด ์ค‘ ๋” ํฐ ๊ฐ’
        • ๋ฌผ๊ฑด์ด ์—†๊ฑฐ๋‚˜ ๋ฐฐ๋‚ญ ์šฉ๋Ÿ‰์ด 0 โ†’ ์ตœ์ ํ•ด๊ฐ€ 0
        • $ object_i $ ์˜ ๋ฌด๊ฒŒ๊ฐ€ ๋ฐฐ๋‚ญ์˜ ์šฉ๋Ÿ‰์„ ๋„˜์–ด์„œ๋Š” ์ƒํ™ฉ โ†’ $ object_i $๊ฐ€ ์ตœ์ ํ•ด์˜ ๋ฐฐ๋‚ญ์— ํฌํ•จ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ๋งŒ ๊ณ ๋ ค
\[K(i, w) = \begin{cases} 0, if (i = 0 or w = 0) \\ K(i - 1, w), if (w < w_i) \\ max(K(i - 1, w), K(i - 1, w - w_i) + p_i), o.w. \end{cases}\]
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 ์‹ค์ œ๋กœ ํ˜ธ์ถœ๋˜๋Š” ๋…ธ๋“œ ์ˆ˜๋Š” ๋ณดํ†ต ์ด๋ณด๋‹ค ์ ์Œ
      • ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ ๊ฐœ์„ ํ•˜๋ฉด ๋‹จ๋ง ๋…ธ๋“œ ํ˜ธ์ถœ์„ ์—†์•จ ์ˆ˜ ์žˆ์Œ
    • ์ค‘์ฒฉ๋œ ๋ถ€๋ฌธ์ œ ํŠน์„ฑ
      • ๋ฌผ๊ฑด ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์„์ˆ˜๋ก ๋ฐฐ๋‚ญ ์šฉ๋Ÿ‰์ด ์ž‘์„์ˆ˜๋ก ๋ถ€๋ฌธ์ œ๊ฐ€ ์ค‘๋ณต๋  ๊ฐ€๋Šฅ์„ฑ์ด ์ปค์ง

@ 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

@ KP_0000
@ KP_0001

Back-Tracking, ์‹ค์ œ๋กœ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค์ง€๋Š” ์•Š๊ณ , ๊ฐ ๋ ˆ๋ฒจ์— ํ•ด๋‹นํ•˜๋Š” ์ƒํƒœ ์ •๋ณด๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.

  • ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ์ƒํƒœ ๊ณต๊ฐ„ ํŠธ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•
    • ๋ถ€๋ถ„ ์ง‘ํ•ฉ์˜ ํ•ฉ ๋ฌธ์ œ์™€ ๋™์ผ
    • ๊ธฐ์–ตํ•ด์•ผ ํ•  ์ •๋ณด๋Š” โ€œ๊ฑธ์–ด์˜จ ๊ธธโ€
    • ๋ ˆ๋ฒจ i ๋…ธ๋“œ๋Š” i ๊ฐœ ๋ฌผ๊ฑด๊ฐ€์šด๋ฐ ๋ฐฐ๋‚ญ์— ๋„ฃ์€ ๋ฌผ๊ฑด๋“ค์„ ๊ธฐ์–ตํ•ด์•ผ ํ•จ
      • ํ•ด๋‹น ๋…ธ๋“œ๊ฐ€ ์œ ๋งํ•˜์—ฌ ์ž์‹ ๋…ธ๋“œ๋กœ ๋‚ด๋ ค๊ฐ„๋‹ค๋ฉด i+1๊ฐœ ๋ฌผ๊ฑด๊ฐ€์šด๋ฐ ๋ฐฐ๋‚ญ์— ๋„ฃ์€ ๋ฌผ๊ฑด๋“ค์„ ๊ธฐ์–ต
      • ์œ ๋งํ•˜์ง€ ์•Š์•„ ๋ถ€๋ชจ ๋…ธ๋“œ๋กœ ๋ฐฑํŠธ๋ž˜ํ‚นํ•œ๋‹ค๋ฉด i -1๊ฐœ ๋ฌผ๊ฑด๊ฐ€์šด๋ฐ ๋ฐฐ๋‚ญ์— ๋„ฃ์€ ๋ฌผ๊ฑด๋“ค์„ ๊ธฐ์–ต
์ธ๋ฑ์Šค1234
ํฌํ•จ์—ฌ๋ถ€falsetruetrue-

๋‹จ๋ง ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ๋…ธ๋“œ๊ฐ€ ํ•ด๋‹ต์ด๋ผ๋ฉด ํ•ด๋‹ต ๋…ธ๋“œ์˜ ๋ ˆ๋ฒจ๊นŒ์ง€ ์ €์žฅ๋œ ๊ฐ’๋งŒ์ด ์œ ํšจ

  • ๋ฐฐ์—ด ์ธ๋ฑ์Šค : ๋ฌผ๊ฑด
  • ๋ฐฐ์—ด ๊ฐ’: ๋ฌผ๊ฑด์˜ ํฌํ•จ ์—ฌ๋ถ€

โˆด 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 ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค ์šฐ์ˆ˜
์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.