본문 바로가기

# Coding/# Algorithm

[보기 쉬운 Algorithm] 냅색(Knapsack) 알고리즘 - Python

728x90
반응형

<설명>

냅색 알고리즘DP(Dynamic Programming)의 한 종류로 많이 쓰이는 방식 중 하나이다.

가방문제에 가장 많이 등장한다!

 

가방에 담을 수 있는 무게 제한이 있고, 각각의 물건은 무게와 가치가 있다. 가방의 무게를 초과하지 않게 물건을 많이 담아 최고 가치를 가지게 하는 문제이다.

 

<구현>

for i in range(1, n+1):
    for j in range(1, k+1):
        w = thing[i][0]   # 물건의 무게
        v = thing[i][1]   # 물건의 가치

        if j < w:   # 현재 무게가 물건 보다 작다면
            table[i][j] = table[i-1][j]  # 위의 값을 그대로
        else:
            table[i][j] = max(table[i-1][j], table[i-1][j-w]+v)

 

 

<예시 문제>

https://www.acmicpc.net/problem/9251

 

9251번: LCS

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

www.acmicpc.net

https://www.acmicpc.net/problem/12865

 

12865번: 평범한 배낭

첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)

www.acmicpc.net

 

728x90
반응형