정해진 무게만 담을 수 있는 가방에 가치가 가장 크도록 물건을 고르는 문제는 예산 배분, 서버 자원 할당, 광고 슬롯 선택처럼 모양만 바뀌어 계속 등장합니다. 0/1 배낭 문제는 동적계획법(DP)을 설명하는 가장 대표적인 예제라 알고리즘 설계 기법 문제에 자주 쓰입니다.
여행 가방에 최대 7kg까지만 넣을 수 있다고 해 봅시다. 앞에 놓인 물건은 저마다 무게와 가치(쓸모)가 다릅니다. 이때 무게 한도를 넘지 않으면서 가치의 합이 가장 커지도록 어떤 물건을 가져갈지 고르는 것이 배낭 문제입니다.
이름의 0/1은 물건마다 선택지가 두 개뿐이라는 뜻입니다. 가져가면 1, 두고 가면 0이고, 물건 하나를 반만 넣거나 같은 물건을 두 개 넣는 일은 허용하지 않습니다. 물건이 n개면 경우의 수는 2의 n제곱입니다. 4개일 때는 16가지라 일일이 따져 볼 수 있지만, 40개만 돼도 1조 가지를 넘어서 전부 확인하는 방법은 쓸 수 없습니다. 그래서 작은 문제의 답을 표에 저장해 재사용하는 동적계획법이 필요해집니다.
입력과 출력을 정리하면 다음과 같습니다.
아래 예시로 보면 쉽습니다. 물건이 A(1kg, 가치 1), B(3kg, 4), C(4kg, 5), D(5kg, 7)이고 용량이 7kg일 때, 가능한 조합 중 B와 C를 함께 넣으면 무게 7kg에 가치 9로 가장 큽니다. 가치가 제일 큰 D를 고르면 남는 2kg에는 A밖에 못 넣어 가치 8에 그칩니다. 이렇게 “당장 좋아 보이는 물건”만 고르면 틀릴 수 있다는 점이 이 문제의 핵심입니다. 이 표를 어떻게 채우는지는 아래에서 단계별로 설명합니다.
정의: 동적계획법은 문제를 겹치는 부분 문제로 나누고 각 부분 문제의 답을 한 번만 계산해 저장(메모이제이션 또는 표 채우기)한 뒤 재사용하는 설계 기법입니다. 최적 부분 구조와 중복 부분 문제라는 두 조건이 있을 때 씁니다.
dp[i][c] = 앞의 i개 물건만 고려하고 용량이 c일 때의 최대 가치
물건은 A(1kg, 가치 1), B(3kg, 4), C(4kg, 5), D(5kg, 7)입니다.
표의 마지막 칸 dp[4][7] = 9가 최대 가치입니다. 어떤 물건을 골랐는지는 거꾸로 따라가며 찾습니다.
결과는 B + C, 무게 7kg, 가치 9입니다(코드로 검산). 가치가 가장 큰 D(7)를 먼저 넣으면 남은 2kg에 A만 들어가 가치 8에 그칩니다. 눈앞의 최선이 전체 최선이 아닌 사례입니다.
| 구분 | 0/1 배낭 | 분할(Fractional) 배낭 |
|---|---|---|
| 물건 처리 | 통째로 넣거나 빼기 | 쪼개서 일부만 넣기 가능 |
| 최적 해법 | 동적계획법(또는 분기 한정) | 단위 무게당 가치 순 탐욕법 |
| 복잡도 | O(nW) | O(n log n), 정렬이 지배 |
| 문제 난이도 | NP-난해(일반적으로) | 다항 시간 |
표 크기가 물건 수 n과 용량 W의 곱이라 O(nW)입니다. 그런데 W는 값의 크기이지 입력 길이가 아닙니다. W를 표현하는 비트 수가 k라면 W는 2^k까지 커질 수 있어, 입력 길이 기준으로는 지수 시간입니다. 그래서 의사 다항 시간(Pseudo-polynomial)이라고 부릅니다. 서술형에서 이 구분을 쓰면 확실한 가점 포인트입니다.
0/1 배낭은 dp[i][c] = max(dp[i-1][c], dp[i-1][c-w]+v) 점화식의 동적계획법으로 O(nW)에 풀고, 물건을 쪼갤 수 있는 분할 배낭만 탐욕법으로 최적해가 보장됩니다.
학습용 정리이며 실제 시험 문항과 다를 수 있습니다. 출제 기준은 큐넷 공지를 확인하세요. 그림은 이해를 돕기 위한 개념도와 예시입니다.
블룸 필터(Bloom Filter)는 "이 값을 본 적이 있는가"라는 질문에 아주 적은 메모리로 답하는 확률적 자료구조다.…
서울 아파트값이 89주째 올랐다는 소식과 강남구·서초구가 11주째 내렸다는 소식이 같은 주에 나왔습니다. 모순처럼 보이지만 둘…
처음 만난 두 사람이 모두가 듣고 있는 자리에서 대화하면서도 둘만 아는 비밀 키를 만들 수…
내비게이션이 가장 빠른 길을 찾고, 라우터가 패킷을 보낼 경로를 정할 때 바탕에 있는 생각은 같습니다.…
서버에 작업을 하나 더 얹었을 뿐인데 갑자기 전체가 느려지고, 정작 CPU 사용률은 바닥으로 떨어지는 경우가…