Skip to content

Commit fa422e8

Browse files
committed
98번 가방문제 (냅색 알고리즘) 수강 완료
1 parent 21bfa4e commit fa422e8

2 files changed

Lines changed: 66 additions & 1 deletion

File tree

인프런_알고리즘_강의/김태원/섹션 5. Dynamic programming(동적계획법)/97. 알리바바와 40인의 도둑(Top-Down).md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ N*N의 계곡의 돌다리 격자정보가 주어지면 (1, 1)격자에서 (N, N
1111
(1, 1)좌표에서 (3, 3)좌표까지 가는데 드는 최소 에너지는 3+2+3+4+2=14이다.
1212

1313
### 입력 설명
14-
▣ 입력설명
1514
첫 번째 줄에는 자연수 N(1<=N<=20)이 주어진다.
1615
두 번째 줄부터 계곡의 N*N 격자의 돌다리 높이(10보다 작은 자연수) 정보가 주어진다.
1716

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
## 문제)
2+
최고 17kg의 무게를 저장할 수 있는 가방이 있다. 그리고 각각 3kg, 4kg, 7kg, 8kg, 9kg의
3+
무게를 가진 5종류의 보석이 있다. 이 보석들의 가치는 각각 4, 5, 10, 11, 13이다.
4+
이 보석을 가방에 담는데 17kg를 넘지 않으면서 최대의 가치가 되도록 하려면 어떻게 담아야
5+
할까요? 각 종류별 보석의 개수는 무한이 많다. 한 종류의 보석을 여러 번 가방에 담을 수 있
6+
다는 뜻입니다.
7+
8+
### 입력 설명
9+
첫 번째 줄은 보석 종류의 개수와 가방에 담을 수 있는 무게의 한계값이 주어진다.
10+
두 번째 줄부터 각 보석의 무게와 가치가 주어진다.
11+
가방의 저장무게는 1000kg을 넘지 않는다. 보석의 개수는 30개 이내이다.
12+
13+
### 출력 설명
14+
첫 번째 줄에 가방에 담을 수 있는 보석의 최대가치를 출력한다.
15+
16+
### 입력 예제
17+
4 11\
18+
5 12\
19+
3 8\
20+
6 14\
21+
4 8
22+
23+
24+
### 출력 예제
25+
28
26+
27+
해설: 5g 1개, 3g 2개를 선택해서 28가치가 최대이다.
28+
29+
### 모범 답안
30+
``` Cpp
31+
#include <iostream>
32+
#include <fstream>
33+
#include <vector>
34+
#include <algorithm>
35+
using namespace std;
36+
int main() {
37+
ios_base::sync_with_stdio(false);
38+
ifstream cin;
39+
cin.open("input.txt");
40+
int n = 0, m = 0, w = 0, v = 0;
41+
cin >> n >> m;
42+
vector<int> dy(m + 1, 0);
43+
44+
for (int i = 0; i < n; i++) {
45+
cin >> w >> v;
46+
for (int j = w; j <= m; j++) {
47+
// 현재 가방의 최대 가치
48+
// vs
49+
// 현재 w라는 무게를 뺀 현재 가방의 공간에 담을 수 있는 최대 가치 + 현재 보석의 무게
50+
// 현재 가방의 최대 가치와 새로운 보석을 넣었을 경우 최대 가치를 비교해서 더 큰값을 dy에 반영한다.
51+
dy[j] = max(dy[j], dy[j - w] + v);
52+
53+
// d[j-w]에서 j-w를 한 이유
54+
// w라는 무게를 갖는 보석을 가방에 담겠다고 가정했을 때문에 j-w를 함
55+
// 그만큼의 무게를 빼줘야 가방의 현재 여유 공간이 얼마인지 알 수 있기 때문에
56+
// 따라서 d[j-w]의 의미는 현재 w라는 무게를 뺀 현재 가방의 공간에 담을 수 있는 최대 가치이다.
57+
}
58+
}
59+
60+
cout << dy[m];
61+
62+
return 0;
63+
}
64+
// dy[j]의 의미
65+
// 가방에 j 무게 보석이 들어 있을 때 최대 가치
66+
```

0 commit comments

Comments
 (0)