포슀트

πŸŒ“ 0-1 λ°°λ‚­ 문제

πŸ’« 0-1 λ°°λ‚­ 문제


배낭에 μ–΄λ–€ 물건을 λ‹΄μ•„μ•Ό μ΅œλŒ€ 이읡을 λ‚Ό 수 μžˆλŠ”μ§€ μ•Œμ•„λ‚΄λŠ” λ¬Έμ œμ΄λ‹€.

각 물건을 ν†΅μ§Έλ‘œ λ„£κ±°λ‚˜ μ•„μ˜ˆ μ•ˆ λ„£κ±°λ‚˜ 택일해야 ν•œλ‹€λŠ” 쑰건이 μžˆμ„ λ•Œ, λ°°λ‚­μ˜ μš©λŸ‰μ„ λ„˜μ§€ μ•ŠμœΌλ©΄μ„œ 배낭에 담을 수 μžˆλŠ” λ¬Όκ±΄λ“€μ˜ μ΅œλŒ€ 이읡이 μ–Όλ§ˆμΈμ§€(μ •ν™•ν•˜κ²ŒλŠ” μ΅œλŒ€ 이읡을 μ–»μ–΄λ‚΄κΈ° μœ„ν•΄ μ–΄λ–€ 물건을 λ‹΄μ•„μ•Ό ν•˜λŠ”μ§€) μ•Œμ•„λ‚΄λŠ” 문제

  • μš•μ‹¬μŸμ΄ λ°©λ²•μœΌλ‘œ ν•΄κ²°ν•  수 μ—†μŒ
  • 뢄할정볡과 동적 κ³„νšλ²•μ„ μ΄μš©ν•˜μ—¬ ν•΄κ²°

μ΅œμ ν™” 문제

@ 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


물건의 λ¬΄κ²Œμ— μ–‘μ˜ μ‹€μˆ˜λ₯Ό ν—ˆμš©ν•œλ‹€λ©΄ 동적 κ³„νšλ²•μ„ μ΄μš©ν•˜λŠ”λ° 어렀움이 있음 (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]);
}
  • μ€‘μ²©λœ λΆ€λ¬Έμ œμ™€ 뢄할정볡
    • λ³΅μž‘λ„ ∝ νŠΈλ¦¬μ— μžˆλŠ” λ…Έλ“œ 수 = μ΅œλŒ€ $ \sum_{l = 1}^n 2^l $ = μ΅œλŒ€ $ 2^{2 + 1} - 1 = O(2^n) $
      • λ¬΄μž‘μœ„ 기법 $ Ɵ(2^n) $ κ³Ό λΉ„μŠ·, but μ‹€μ œλ‘œ ν˜ΈμΆœλ˜λŠ” λ…Έλ“œ μˆ˜λŠ” 보톡 이보닀 적음
      • μ•Œκ³ λ¦¬λ“¬μ„ κ°œμ„ ν•˜λ©΄ 단말 λ…Έλ“œ ν˜ΈμΆœμ„ 없앨 수 있음
    • μ€‘μ²©λœ λΆ€λ¬Έμ œ νŠΉμ„±
      • 물건 κ°œμˆ˜κ°€ λ§Žμ„μˆ˜λ‘ λ°°λ‚­ μš©λŸ‰μ΄ μž‘μ„μˆ˜λ‘ λΆ€λ¬Έμ œκ°€ 쀑볡될 κ°€λŠ₯성이 컀짐

@ KP_B

@ κ°€λ°© 곡간이 μ μ–΄μ„œ κ³„μ‚°ν•˜μ§€ μ•ŠλŠ”, λΆ€λ¬Έμ œκ°€ ν•˜λ‚˜ 밖에 μ—†λŠ” μΌ€μ΄μŠ€κ°€ 생길 수 있음

동적 κ³„νšλ²•μœΌλ‘œ ν’€κΈ° : ν•¨μˆ˜ λŒ€μ‹  λ°°μ—΄λ‘œ

🫧 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. 뢄할정볡 μ•Œκ³ λ¦¬μ¦˜μ˜ λ³΅μž‘λ„ $ O(2^n) $
    • μ–΄λŠ μͺ½μ˜ μ„±λŠ₯이 더 쒋은가? : β€œμ•Œ 수 없닀”
      • M의 값이 맀우 크면 뢄할정볡 μ•Œκ³ λ¦¬μ¦˜μ˜ μ„±λŠ₯이 더 λ‚˜μ„ μˆ˜λ„ 있음
      • 예) $ 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 - μ•Œκ³ λ¦¬λ“¬

  • μ§€κΈˆκΉŒμ§€ μ‚΄νŽ΄λ³Έ 동적 κ³„νšλ²• μ•Œκ³ λ¦¬μ¦˜μ€ 물건 λ¬΄κ²Œλ‚˜ λ°°λ‚­ μš©λŸ‰μ΄ μ‹€μˆ˜μΈ κ²½μš°μ—λŠ” μ‚¬μš© λΆˆκ°€
    • β€œμ›μΉ™μ— μΆ©μ‹€ν•˜μžβ€
      • 이산 정보인 μ •μˆ˜ λŒ€μ‹  연속 정보인 μ‹€μˆ˜λ₯Ό μ²˜λ¦¬ν•˜λ„λ‘ κ°œμ„ 
      • 이산 정보λ₯Ό ν‘œν˜„ν•˜λŠ” 도ꡬ인 λ°°μ—΄ λŒ€μ‹  연속 정보λ₯Ό ν‘œν˜„ν•˜λŠ” 도ꡬ인 ν•¨μˆ˜μ— 초점
  • ν•¨μˆ˜ $ 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-μ™„μ „ 문제 μ€‘μ—λŠ” 비ꡐ적 λ…Έλ“œμˆ˜κ°€ μ μ§€λ§Œ μ—¬μ „νžˆ μ§€μˆ˜ λ³΅μž‘λ„

μœ λ§ν•œ λ…Έλ“œ 수

  • μœ λ§ν•œ λ…Έλ“œ 개수λ₯Ό 계산할 수 μ—†μŒ
  • 같은 개수의 λ…Έλ“œλ₯Ό 갖더라도 λ°°λ‚­ μš©λŸ‰μ΄λ‚˜ 물건 λ¬΄κ²Œμ— 따라 μœ λ§ν•œ λ…Έλ“œμ˜ μˆ˜κ°€ 달라짐
  • μ΅œμ ν™” 문제 β†’ μƒνƒœ 곡간 트리λ₯Ό λͺ¨λ‘ λ’€μ Έμ•Ό 함. 단지 νƒμƒ‰ν•˜λŠ” λ…Έλ“œμ˜ μˆ˜κ°€ λ‹¬λΌμ§ˆ 뿐

동적 κ³„νšλ²• vs. λ°±νŠΈλž˜ν‚Ή

  • Horowitz와 Sahni의 λͺ…μ € β€œFundamentals of Computer Algorithmsβ€μ—λŠ” Venkateshκ°€ μ‹€μ œ μ»΄ν“¨ν„°μƒμ—μ„œ μ‹€ν–‰μ‹œμΌœ λ³Έ κ²°κ³Όκ°€ 수둝: λ‹€μŒ 4가지 경우의 데이터 집합 μ‚¬μš©
    • ➊ 각 물건의 λ¬΄κ²Œμ™€ 이읡을 1~1,000 λ²”μœ„ μ•ˆμ—μ„œ μž„μ˜λ‘œ μƒμ„±ν•œ 경우
    • βž‹ 각 물건의 λ¬΄κ²Œμ™€ 이읡을 1~100 λ²”μœ„ μ•ˆμ—μ„œ μž„μ˜λ‘œ μƒμ„±ν•œ 경우
    • ➌ 각 물건 무게λ₯Ό 1~100 λ²”μœ„ μ•ˆμ—μ„œ μž„μ˜λ‘œ μƒμ„±ν•˜κ³  이읡은 λ¬΄κ²Œμ— 10을 λ”ν•œ 경우
    • ➍ 각 물건 무게λ₯Ό 1~100 λ²”μœ„ μ•ˆμ—μ„œ μž„μ˜λ‘œ μƒμ„±ν•˜κ³  이읡은 λ¬΄κ²Œμ— 1.1을 κ³±ν•œ 경우
    • λ°°λ‚­ μš©λŸ‰ M은 물건 무게의 합에 절반이 λ˜λ„λ‘ ν•˜κ³  물건의 개수 n에 λŒ€ν•΄ 10κ°œμ”©μ˜ μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ 츑정값을 비ꡐ β†’ 일반적으둜 λ°±νŠΈλž™ν‚Ή μ•Œκ³ λ¦¬μ¦˜μ΄ 동적 κ³„νšλ²• μ•Œκ³ λ¦¬μ¦˜λ³΄λ‹€ 우수
이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.