반응형
https://www.acmicpc.net/problem/12865
이 문제같은 경우 다이나믹 프로그래밍에 대표적인 문제라고 할 수 있다.
각 경우에 대해서 최선의 선택을 하면서 가면 되는데 이 말을 이해하기 위해서는 직접해보는 것이 좋다.
표를 직접 그려봤다면 이게 무슨 원리인지 알 것이다. 자신이 채우고 있는 행의 최선의 선택은
1. dp[i][j] = dp[i][j-현재 물건 무게] + 현재 물건 가치 이다.
2. dp[i][j] = dp[i-1][j] or dp[i][j-1] 둘 중 큰 값
1,2번중에서 큰 값을 선택해주면 최선의 선택이 된다.
전체코드
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
27
28
29
30
31
32
33
34
35
36
37
38
|
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int dp[102][100002] = {0};
int mx(int a, int b){
return a > b ? a : b;
}
bool cmp(pair<int, int> p1, pair<int, int> p2){
return p1.first < p2.first;
}
int main(){
vector<pair<int, int>> wv;
int n, k, w, v;
cin >> n >> k;
wv.push_back(make_pair(0, 0));
for (int i = 0; i < n;i++){
cin >> w >> v;
wv.push_back(make_pair(w, v));
}
sort(wv.begin(), wv.end(), cmp); //무게 기준 정렬
for (int i = 1; i <= n; i++){
for (int j = 1; j <= k;j++){
if(j-wv[i].first >=0){
// j-물건 무게가 음수이면 물건을 넣지 못함.
dp[i][j] = dp[i - 1][j - wv[i].first] + wv[i].second;
}
if(mx(dp[i-1][j], dp[i][j-1]) > dp[i][j]){
dp[i][j] = mx(dp[i - 1][j], dp[i][j - 1]);
//바로 직전 값과 위의 행 값을 비교
}
}
}
cout << dp[n][k];
return 0;
}
|
cs |
체감난이도 | 걸린시간 | 참고 | 사용 알고리즘 |
중 | 26min | x | dynamic programming 다이나믹 프로그래밍 |
반응형
'알고리즘 > 백준' 카테고리의 다른 글
백준 11650 좌표 정렬하기 c++ [컴공과고씨] (0) | 2022.04.12 |
---|---|
백준 23284 모든 스택 수열 c++ [컴공과고씨] (0) | 2022.04.12 |
백준 22352 항체 인식 c++ [컴공과고씨] (0) | 2022.04.08 |
백준 9251 LCS c++ [컴공과고씨] (0) | 2022.04.08 |
백준 11726 2×n 타일링 c++ [컴공과고씨] (0) | 2022.04.06 |