Skip to content

Commit b1bf6ed

Browse files
committed
[백준] 평범한 배낭 / 골드 5 / 70분
https://www.acmicpc.net/problem/12865
1 parent b11c4b1 commit b1bf6ed

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
'''
2+
3+
1. 입력 받기
4+
2. dp에는 각 용량, 각 물건 당 넣을 수 있는 최대 가치를 저장.
5+
예) dp[1][1]은 배낭 용량이 1이고, 넣을 수 있는 물건이 1까지 일떄 가질 수 있는 최대 가치
6+
2.1 점화식을 쓰기 위해 무게순으로 물건을 오름차순 정렬해야 할 듯
7+
2.2 반복문 안에서 현재 지정된 물건을 넣는 경우와 못 넣는 경우 두가지로 분리하여 생각
8+
2.3 현재 물건을 i라고 했을 때, 점화식은 i의 가치 + dp[i-1][(배낭 용량 - i의 무게)] , dp[i-1][j]
9+
3. dp 배열 중 마지막 값, [N][K]번 요소 출력
10+
11+
'''
12+
13+
N, K = map(int, input().split())
14+
15+
arr = []
16+
17+
# 입력받기
18+
for i in range(N):
19+
W, V = map(int, input().split())
20+
arr.append([W, V])
21+
22+
# 무게순으로 물건 오름차순 정렬
23+
sorted_arr = sorted(arr, key=lambda x: x[0])
24+
25+
dp = [[0] * (K + 1) for i in range(N + 1)]
26+
27+
for i in range(N + 1):
28+
for j in range(K + 1):
29+
if i == 0 or j == 0:
30+
continue
31+
# 현재 배낭의 용량이 i번 물건을 담을 수 없는 경우
32+
if sorted_arr[i - 1][0] > j:
33+
# 이전 물건 기준 배낭의 최대 가치 그대로 가져오기
34+
dp[i][j] = dp[i - 1][j]
35+
else:
36+
# 현재 배낭의 용량이 i번 물건을 담을 수 있는 경우
37+
# 배낭에 물건을 담은 경우, 담지 않은 경우 두 가지 중 큰거 입력
38+
dp[i][j] = max(sorted_arr[i - 1][1] + dp[i - 1][j - sorted_arr[i - 1][0]], dp[i - 1][j])
39+
40+
print(dp[N][K])

0 commit comments

Comments
 (0)