- 현재 허용 무게에서 최대 가치를 dp 테이블에 저장해 나감
- 현재 물건을 넣었을 때와 넣지 않았을 때를 비교하여 큰 값을 dp 테이블에 저장
- 현재 물건을 넣었을 때를 보려면 현재의 허용 무게에서 현재 물건의 무게를 빼야함. 현재의 허용 무게에서 현재 물건의 무게를 뺐을 때의 최대 가치는 dp 테이블에 저장되어 있으므로 그 최대 가치를 찾아감
- 아래 그림 예시에서, 3의 무게를 가진 물건을 넣기 위해 현재 허용 무게인 7에서 3을 뺌 → 7-3 = 4
- 허용 무게가 4일 때의 최대 가치를 찾아감 → (2, 4)
- 허용 무게 4에서 현재 물건을 넣었을 때의 값과, 현재 허용 무게인 7에 있던 값을 비교함 → 8+6 vs. 13
- 현재 물건을 넣었을 때를 보려면 현재의 허용 무게에서 현재 물건의 무게를 빼야함. 현재의 허용 무게에서 현재 물건의 무게를 뺐을 때의 최대 가치는 dp 테이블에 저장되어 있으므로 그 최대 가치를 찾아감
풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# knapsack[i][j] = max(현재 물건 가치 + knapsack[이전 물건][현재 가방 무게 - 현재 물건 무게], knapsack[이전 물건][현재 가방 무게])
# knapsack[i][j] = max(value + knapsack[i - 1][j - weight], knapsack[i - 1][j])
import sys
input = sys.stdin.readline
# 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K
N, K = map(int,input().split())
items = [[0,0]]
knapsack = [[0 for _ in range(K + 1)] for _ in range(N + 1)]
for _ in range(N):
items.append(list(map(int, input().split())))
for i in range(1, N + 1):
for j in range(1, K + 1):
weight = items[i][0]
value = items[i][1]
if j < weight:
knapsack[i][j] = knapsack[i - 1][j] # weight보다 작으면 위의 값을 그대로 가져온다
else:
knapsack[i][j] = max(value + knapsack[i - 1][j - weight], knapsack[i - 1][j])
print(knapsack[N][K])