빙수의 팝콘

[백준] 12865번 평범한 배낭 본문

빙수의 coding/백준

[백준] 12865번 평범한 배낭

팝빙수 2023. 12. 21. 17:08

문제 설명

 

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

입력으로 주어지는 모든 수는 정수이다.

 

출력

한 줄에 배낭에 넣을 수 있는 물건들의 가치합의 최댓값을 출력한다.

 

 

입력 예시

4 7
6 13
4 8
3 6
5 12

 

출력 예시

14

 

 

 

전형적인 dp 문제이다. 수업시간에도 배웠던 문제라 아주 쉽게 해결할거라 생각했는데... 아직 실력이 많이 부족한가보다ㅠㅠ 첨에 repetition이 가능한 문제인줄 알았는데.. 잘 읽어보면 알겠지만 이 문제는 repetition이 불가능한 0-1 knapsack problem이다.

 

 

코드를 바로 보고 싶지 않다면 먼저 아래 pseudocode를 보고 작성해보자.

 

 

 

작성한 코드는 아래와 같다.

n, k = map(int, input().split())
weight = []
value = []

for i in range(n):
    w, v = map(int, input().split())
    weight.append(w)
    value.append(v)

# knapsack with repetition
max_v = [[0] * (n+1) for i in range(k+1)]


for j in range(n):
    for w in range(k):
        if(weight[j] > w+1): 
            max_v[w+1][j+1] = max_v[w+1][j]
        else:
            max_v[w+1][j+1] = max(max_v[w + 1- weight[j]][j] + value[j], max_v[w+1][j])
            
print(max_v[k][n])