**Knapsack 문제(배낭 문제)**는 조합 최적화 문제로, 주어진 조건 하에서 최대 또는 최적의 결과를 찾는 문제입니다. 이 문제는 동적 계획법(Dynamic Programming)이나 탐욕법(Greedy Algorithm)을 활용하여 풀 수 있습니다. 배낭 문제는 크게 두 가지로 나눌 수 있습니다.
1. 0-1 Knapsack 문제
def knapsack(weights, values, W):
n = len(weights)
dp = [[0] * (W + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
for w in range(W + 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][W]
# Example usage
weights = [5, 4, 6]
values = [10, 40, 30]
W = 10
print(knapsack(weights, values, W)) # Output: 50
2. Unbounded Knapsack 문제
def unbounded_knapsack(weights, values, W):
n = len(weights)
dp = [0] * (W + 1)
for i in range(n):
for w in range(weights[i], W + 1):
dp[w] = max(dp[w], dp[w - weights[i]] + values[i])
return dp[W]
# Example usage
weights = [5, 4]
values = [10, 40]
W = 10
print(unbounded_knapsack(weights, values, W)) # Output: 100
'Coding Test > 알고리즘 이론' 카테고리의 다른 글
균형잡힌 이진 트리 (Balanced Binary Tree) - leetcode (40) (0) | 2025.01.11 |
---|---|
Augmenting Data Structures - leetcode (30) (0) | 2025.01.11 |
문자열 탐색|| (65) (0) | 2025.01.08 |
문자열 심화: Naive String Matching (4)과 Boyer-Moore 알고리즘 (7) (2) | 2025.01.07 |
문자열 심화: Trie 트라이 문제 (19) (0) | 2025.01.07 |