ํฌ์ŠคํŠธ

Subset Sum Problem

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 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.