728x90
반응형
- 배낭 문제(
Knapsack Problem
) 는 조합 최적화 문제 중 하나로, 주어진 제한된 자원을 활용하여 최대의 가치를 얻는 방법을 찾는 문제입니다.
- 어떤 배낭이 담을 수 있는 최대 무게(
Capacity
) 가 있을 때, 각각의 아이템 은 고유한 무게(Weight
) 와 가치(Value
) 를 가집니다. - 이때 배낭에 넣을 수 있는 아이템의 조합 중 가치의 합이 최대가 되는 조합을 찾는 것이 목표입니다.`
-
- 0/1 배낭 문제 (
0/1 Knapsack Problem
):
- 각 아이템은 하나씩만 선택 가능.
- 선택(1)하거나 선택하지 않음(0).
- 0/1 배낭 문제 (
-
- 분수 배낭 문제 (
Fractional Knapsack Problem
):
- 아이템의 일부를 나눠 배낭에 넣을 수 있음.
- 탐욕 알고리즘(greedy approach)으로 해결 가능.
- 분수 배낭 문제 (
-
0/1 배낭 문제에 적합.
-
DP 테이블:
-
점화식:
- 최적화된 탐색을 통해 불필요한 계산을 줄임.
- 사용 사례: 문제의 입력 크기가 큰 경우.
0/1 배낭 문제: 최대 가치 = 220
분수 배낭 문제: 최대 가치 = 240
python
def knapsack(weights, values, capacity):
n = len(values)
dp = [[0] * (capacity + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
for w in range(capacity + 1):
if weights[i - 1] <= w:
dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - weights[i - 1]] + values[i - 1])
else:
dp[i][w] = dp[i - 1][w]
return dp[n][capacity]
weights = [10, 20, 30]
values = [60, 100, 120]
capacity = 50
print(knapsack(weights, values, capacity)) # 출력: 220
- 0/1 배낭 문제는 동적 계획법이 적합하지만, 입력 크기가 매우 크면 효율적으로 해결하기 어렵습니다.
- 분수 배낭 문제는 탐욕 알고리즘으로 빠르게 해결 가능합니다.
728x90
반응형
'Algorithm' 카테고리의 다른 글
그뢰츠쉬의 정리(Grotzsch's Theorem) (0) | 2025.01.01 |
---|---|
4색 정리 (Four Color Theorem) (0) | 2024.12.28 |
암달의 법칙(Amdahl's Law) (0) | 2024.12.23 |
축 분리 정리 (Separating Axis Theorem, SAT) (0) | 2024.12.21 |
다항 시간 (polynomial time) (0) | 2024.12.20 |