(알고리즘) 배낭 문제 (knapsack Problem)

brian·2022년 6월 5일

1. 개요

조합최적화 문제의 일종이다. 한정된 가방의 무게 W안에서 가치가 최대가 되도록 아이템들의 부분집합을 찾는 문제이다.
'분할 가능한 배낭'과 '분할 가능하지 않은 배낭' 문제로 구분된다. 후자는 흔히 '0-1 배낭 문제'로 표현된다.

2. 0-1 배낭문제

0-1 배낭문제 (0-1 Knapsack Problem)는 동적계획법, 백트래킹 등의 조합 최적화 문제 풀이의 방법을 사용해야 한다.

동적계획법을 이용한 풀이

def knapsack2(i, W, w, p):
    if (i <= 0 or W <= 0):
        return 0
    if (w[i] > W):
        value = knapsack2(i - 1, W, w, p)
        print(i - 1, W, value)
        return value
    else: # w[i] <= W
        left = knapsack2(i - 1, W, w, p)
        print(i - 1, W, left)
        right = knapsack2(i - 1, W - w[i], w, p)
        print(i - 1, W - w[i], right)
        return max(left, p[i] + right)

출처 : https://namu.wiki/w/%EB%B0%B0%EB%82%AD%20%EB%AC%B8%EC%A0%9C

0개의 댓글