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
๊ฐ ๋ฌผ๊ฑด ๊ฐ์ด๋ฐ ๋ฐฐ๋ญ์ ๋ฃ์ ๋ฌผ๊ฑด๋ค์ ๊ธฐ์ต
- ํด๋น ๋
ธ๋๊ฐ ์ ๋งํ์ฌ ์์ ๋
ธ๋๋ก ๋ด๋ ค๊ฐ๋ค๋ฉด, ๋ค์ ๋จ๊ณ์
์ธ๋ฑ์ค | 1 | 2 | 3 | 4 |
ํฌํจ์ฌ๋ถ | fales | true | false | true |
๋จ๋ง ๋ ธ๋๊ฐ ์๋ ๋ ธ๋๊ฐ ํด๋ต์ด๋ผ๋ฉด ํด๋ต ๋ ธ๋์ ๋ ๋ฒจ๊น์ง ์ ์ฅ๋ ๊ฐ๋ง์ด ์ ํจ
- ๋ฐฐ์ด ์ธ๋ฑ์ค : ๋ฌผ๊ฑด
- ๋ฐฐ์ด ๊ฐ: ๋ฌผ๊ฑด์ ํฌํจ ์ฌ๋ถ
โด 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-์์ ๋ฌธ์ ์ค์๋ ๋น๊ต์ ๋
ธ๋์๊ฐ ์ ์ง๋ง ์ฌ์ ํ ์ง์ ๋ณต์ก๋
์ ๋งํ ๋ ธ๋ ์
- ํด๋ฐํด ์ฌ์ดํด ๋ฌธ์ ์ฒ๋ผ ์ ๋งํ ๋ ธ๋ ๊ฐ์๋ฅผ ๊ณ์ฐํ ์ ์์
- ๊ฐ์ ๊ฐ์์ ์ ์ ์ด๋ผ ํ๋๋ผ๋ ๋ฐฐ๋ญ ์ฉ๋์ด๋ ๋ฌผ๊ฑด ๋ฌด๊ฒ์ ๋ฐ๋ผ ์ ๋งํ ๋ ธ๋์ ์๊ฐ ๋ฌ๋ผ์ง
- ์์ฃผ ๋นจ๋ฆฌ ํด๋ต์ ์ป์ ์๋ ์๊ณ ์ํ ๊ณต๊ฐ ํธ๋ฆฌ๋ฅผ ๋ชจ๋ ๋ค์ ธ์ผ ํ ์๋ ์์
- ๊ฐ์ฅ ๋ฌด๊ฑฐ์ด ๋ฌผ๊ฑด์ ์ ์ธํ ๋๋จธ์ง ๋ฌผ๊ฑด๋ค์ ๋ฌด๊ฒ ํฉ์ด ๋ฐฐ๋ญ์ ์ฉ๋๋ณด๋ค ์๊ณ , ๊ฐ์ฅ ๋ฌด๊ฑฐ์ด ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๊ฐ ๋ฐฐ๋ญ์ ์ฉ๋๊ณผ ๊ฐ๋ค๋ฉด ํด๋ต์ ์ฐพ๊ธฐ ์ํด ๋ชจ๋ ๋ ธ๋๋ฅผ ํ์ํ์ฌ์ผ ํจ