포슀트

πŸŒ“ Subset Sum Problem

πŸ’« Subset Sum Problem (Sum of Subsets Problem)


λΆ€λΆ„μ§‘ν•©μ˜ ν•© 문제

μœ ν•œκ°œμ˜ μ •μˆ˜λ₯Ό μ›μ†Œλ‘œ ν•˜λŠ” 집합이 μžˆμ„ λ•Œ μ›μ†Œμ˜ 합이 0이 λ˜λŠ” 뢀뢄집합이 μ‘΄μž¬ν•˜λŠ”μ§€ μ•Œμ•„λ‚΄λŠ” 문제(단 곡집합은 μ œμ™Έ)
i.e. 집합{-4, -2, 1, 3}의 경우 뢀뢄집합 {-4, 1, 3}의 μ›μ†Œ 합이 0
μ›μ†Œ 합에 κ΄€ν•œ 쑰건을 μž„μ˜μ˜ μ •μˆ˜λ‘œ μΌλ°˜ν™” κ°€λŠ₯ (ν•© 0 β†’ ν•© n)

물건의 λ‹¨μœ„ λ¬΄κ²Œλ‹Ή 이읡이 λ™μΌν•œ 0-1 λ°°λ‚­ 문제
0-1 λ°°λ‚­ λ¬Έμ œμ—μ„œ μ΅œλŒ€ 이읡은 λ°°λ‚­ μš©λŸ‰ M을 꽉 μ±„μšΈ 경우 = μ›μ†Œλ₯Ό μ–‘μˆ˜λ‘œ ν•œμ •ν•˜λŠ” λΆ€λΆ„μ§‘ν•©μ˜ ν•© λ¬Έμ œμ™€ 동일

@ 자료 Subset0000
@ 주의 : wi < wi+1

각 물건의 이읡에 λŒ€ν•œ μ •λ³΄λŠ” 더 이상 ν•„μš” μ—†μŒ
주의 : 물건을 λ¬΄κ²Œμ— 따라 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬

@ 무게 M이 κΌ­ 0이 μ•„λ‹ˆμ—¬λ„ 됨 (μž„μ˜μ˜ μ •μˆ˜λ‘œ μΌλ°˜ν™” κ°€λŠ₯)

@ SSP_0000

πŸ’« Solve By BackTracking


🫧 μƒνƒœ 곡간 트리

N-Queen, K-Graph-Coloringκ³Ό λ‹€λ₯΄κ²Œ, λ…Έλ“œμ— μœ„μΉ˜ 정보가 μ €μž₯λ˜λŠ” 것이 μ•„λ‹ˆκ³ , 각 λ…Έλ“œ κΈ°μ€€ λ¬΄κ²Œκ°€ μ €μž₯됨

🫧 μ•Œκ³ λ¦¬λ“¬

  • 레벨 i의 λ…Έλ“œκ°€ μœ λ§ν•˜μ§€ μ•ŠμŒμ„ νŒλ³„ν•˜λŠ” κΈ°μ€€
      • ν˜„μž¬ i번째 λ¬Όκ±΄κΉŒμ§€ κ²°μ •λœ μƒνƒœμ΄κ³  ν˜„μž¬κΉŒμ§€ 배낭에 넣은 λ¬Όκ±΄λ“€μ˜ 무게의 합을 weight라 ν•˜λ©΄ λ‹€μŒ κ²½μš°μ— μœ λ§ν•˜μ§€ μ•Šμ€ λ…Έλ“œ
      • κ·œμΉ™ 1) ν˜„μž¬κΉŒμ§€μ˜ λ¬΄κ²Œκ°€ λ°°λ‚­μ˜ 무게λ₯Ό 초과: $weight + rest > M$
      • κ·œμΉ™ 2) 아직은 배낭에 μ—¬μœ κ°€ μžˆμ§€λ§Œ μ–΄λ–€ 물건을 μΆ”κ°€λ‘œ 넣더라도 초과
        • $weight + w_{i+1} > M$
        • 물건을 λ¬΄κ²Œμ— 따라 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ 이유
        • κ·œμΉ™ 2λ₯Ό μ‘°μ‚¬ν•˜μ—¬ κ°€μ§€μΉ˜κΈ°λ₯Ό ν•˜κ²Œ 되면 κ·œμΉ™ 1에 μ˜ν•œ μœ λ§ν•˜μ§€ μ•Šμ€ κ²½μš°λŠ” μ ˆλŒ€λ‘œ λ°œμƒ λΆˆκ°€λŠ₯ β†’ κ·œμΉ™ 1은 검사할 ν•„μš” μ—†μŒ
      • κ·œμΉ™ 3) 남은 물건을 λͺ¨λ‘ 배낭에 넣어도 λ°°λ‚­ μš©λŸ‰μ— λ―ΈμΉ˜μ§€ λͺ»ν•¨
        • 남은 λ¬Όκ±΄λ“€μ˜ 무게 합을 rest라 ν•  λ•Œ, $weight + rest < M$

@ SSP_0001

  • 배열을 μ΄μš©ν•˜μ—¬ μƒνƒœ 곡간 트리λ₯Ό κ΄€λ¦¬ν•˜λŠ” 방법
    • κΈ°μ–΅ν•΄μ•Ό ν•  μ •λ³΄λŠ” β€œκ±Έμ–΄μ˜¨ 길”
    • 레벨 i λ…Έλ“œλŠ” i 개 λ¬Όκ±΄κ°€μš΄λ° 배낭에 넣은 물건듀을 κΈ°μ–΅ν•΄μ•Ό 함
      • ν•΄λ‹Ή λ…Έλ“œκ°€ μœ λ§ν•˜μ—¬ μžμ‹ λ…Έλ“œλ‘œ λ‚΄λ €κ°„λ‹€λ©΄, λ‹€μŒ 단계에 i + 1개 물건 κ°€μš΄λ° 배낭에 넣은 물건듀을 κΈ°μ–΅
      • ν•΄λ‹Ή λ…Έλ“œκ°€ μœ λ§ν•˜μ§€ μ•Šμ•„ λΆ€λͺ¨ λ…Έλ“œλ‘œ λ˜λŒμ•„κ°„λ‹€λ©΄, λ‹€μŒ 단계에 i - 1개 물건 κ°€μš΄λ° 배낭에 넣은 물건듀을 κΈ°μ–΅
인덱슀1234
포함여뢀falestruefalsetrue

단말 λ…Έλ“œκ°€ μ•„λ‹Œ λ…Έλ“œκ°€ 해닡이라면 ν•΄λ‹΅ λ…Έλ“œμ˜ λ ˆλ²¨κΉŒμ§€ μ €μž₯된 κ°’λ§Œμ΄ 유효

  • λ°°μ—΄ 인덱슀 : 물건
  • λ°°μ—΄ κ°’: 물건의 포함 μ—¬λΆ€

∴ n 개의 κ°’(true/false)색을 μ €μž₯ν•  수 μžˆλŠ” 1차원 배열이 ν•„μš”

🫧 κ΅¬ν˜„

SumOfSubsetsBT(0, 0, rest)λ₯Ό ν˜ΈμΆœν•¨μœΌλ‘œμ¨,
μ‹œμž‘ λ³€μˆ˜ rest의 초기 값은 λͺ¨λ“  물건의 무게 ν•© = λ°°μ—΄ W[ ]의 값을 λͺ¨λ‘ λ”ν•œ κ°’

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
void SumOfSubsetsBT(int i, int weight, int rest)
{
	if (!Promising(i, weight, rest)) // μœ λ§ν•˜μ§€ μ•ŠμœΌλ©΄ 패슀
		return;

	if (weight == M) // 찾으면 μ¦‰μ‹œ 끝 (κ²°μ • 문제)
	{
		OutputSolution(i);
		Exit(); // λŒ€μΆ© λλ‚˜λŠ” ν•¨μˆ˜
	}
	else
	{
		// μ™Όμͺ½, 였λ₯Έμͺ½ 두 개의 λ…Έλ“œλ§Œ 보면 됨 (μ΄μ§„νŠΈλ¦¬)
		X[i + 1] = true;
		SumOfSubsetsBT(i + 1, weight + W[i + 1], rest - W[i + 1]);
		X[i + 1] = false;
		SumOfSubsetsBT(i + 1, weight, rest - W[i + 1]);
	}
}

bool Promising(int i, int weight, int rest)
{
	// μœ λ§ν•˜μ§€ μ•Šμ€ 경우
	// 1. 남은 κ±Έ λ‹€ 더해도 λͺ©ν‘œ λ¬΄κ²Œμ— '도달'ν•  수 μ—†μŒ (λ ˆν€΄μ—  γ„·γ„·)
	// 2. λ¬΄κ²Œκ°€ λ„˜μΉ¨
	if (weight + rest < M)
		return false;
	
	// (weight == M) β†’ ν•΄λ‹΅
	if ((weight != M) && (weight + W[i + 1] > M))
		return false;
	
	return true;
}

🫧 뢄석

μƒνƒœ 곡간 트리의 λ…Έλ“œ 수

\[1 + 2 + 2^1 + ... + 2^n = 2^{n+1} - 1\]

2-κ·Έλž˜ν”„ 채색 λ¬Έμ œμ™€ 같은 λ…Έλ“œμˆ˜
NP-μ™„μ „ 문제 μ€‘μ—λŠ” 비ꡐ적 λ…Έλ“œμˆ˜κ°€ μ μ§€λ§Œ μ—¬μ „νžˆ μ§€μˆ˜ λ³΅μž‘λ„

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

  • ν•΄λ°€ν„΄ 사이클 문제처럼 μœ λ§ν•œ λ…Έλ“œ 개수λ₯Ό 계산할 수 μ—†μŒ
  • 같은 개수의 정점이라 ν•˜λ”λΌλ„ λ°°λ‚­ μš©λŸ‰μ΄λ‚˜ 물건 λ¬΄κ²Œμ— 따라 μœ λ§ν•œ λ…Έλ“œμ˜ μˆ˜κ°€ 달라짐
  • μ•„μ£Ό 빨리 해닡을 얻을 μˆ˜λ„ 있고 μƒνƒœ 곡간 트리λ₯Ό λͺ¨λ‘ λ’€μ Έμ•Ό ν•  μˆ˜λ„ 있음
    • κ°€μž₯ 무거운 물건을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ λ¬Όκ±΄λ“€μ˜ 무게 합이 λ°°λ‚­μ˜ μš©λŸ‰λ³΄λ‹€ μž‘κ³ , κ°€μž₯ 무거운 물건의 λ¬΄κ²Œκ°€ λ°°λ‚­μ˜ μš©λŸ‰κ³Ό κ°™λ‹€λ©΄ 해닡을 μ°ΎκΈ° μœ„ν•΄ λͺ¨λ“  λ…Έλ“œλ₯Ό νƒμƒ‰ν•˜μ—¬μ•Ό 함
이 κΈ°μ‚¬λŠ” μ €μž‘κΆŒμžμ˜ CC BY 4.0 λΌμ΄μ„ΌμŠ€λ₯Ό λ”°λ¦…λ‹ˆλ‹€.