STUDY/Algorithm

[백준] 12865 평범한 배낭 python

sinawi95 2021. 10. 12. 21:05
728x90

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

import sys; input = sys.stdin.readline
N, K = map(int, input().split())
stuff_list = [tuple(map(int, input().split())) for _ in range(N)]
memo = [[0 for _ in range(K + 1)] for _ in range(N + 1)]

for i in range(1, N + 1) :
    for j in range(1, K + 1):
        if stuff_list[i - 1][0] > j:
            memo[i][j] = memo[i - 1][j]
        else:
            memo[i][j] = max(memo[i - 1][j],
                             stuff_list[i - 1][1] + memo[i - 1][j - stuff_list[i - 1][0]])

print(memo[N][K])

Dynamic Programming 중 하나인 Knapsack 문제이다.

stuff_list은 인덱스마다 물건의 무게와 가치가 저장된 이차 배열이고, 메모이제이션을 사용하기 위해 (N + 1) * (K + 1)의 이차 배열을 선언하고 dp 방식으로 하나씩 채워가면된다. 

물건의 무게가 현재 찾는 무게보다 큰 경우 넣지 않는 것으로 판단하여 이전 값(i - 1)을 저장한다. 무게를 넘지않은 경우 넣지 않은 상태의 가치와 물건을 넣었을 때 만들수 있는 가치 중 최대값을 저장한다. 물건을 넣었을때 만들수 있는 가치는 물건의 가치에 이전 상태에서 물건만큼의 무게를뺀 값으로 구할수 있다. 

뭔가 말로하면 어려운데 `stuff_list[i - 1][1] + memo[i - 1][j - stuff_list[i - 1][0]]` 식으로 보면 조금더 쉽게 볼수 있다.

 

 

'STUDY > Algorithm' 카테고리의 다른 글

[백준] 9205 맥주 마시면서 걸어가기  (0) 2021.10.14
[백준] 3190 뱀 python  (0) 2021.10.14
[백준] 2565 전깃줄 python  (0) 2021.10.11
[백준] 2021 최소 환승 경로 python  (0) 2021.08.15
[백준] 1238 파티, python  (0) 2021.08.12