문제 : https://www.acmicpc.net/problem/12865
[ 알고리즘풀이 ]
DP 문제입니다.
DP[K] : 무게를 K만큼 사용했을 때, 담을 수 있는 최대 가치. 라고 정의합니다.
1 ~ N 개의 물건을 차례대로 순회하며 DP 배열을 채우면 O(N * K) 만에 문제를 해결할 수 있습니다.
DP 배열 정의하는 것보다는 물건을 기준으로 배열을 채우는게 문제 풀이의 핵심인 것 같습니다. ( 같은 물건을 2번 사용하지 않을 수 있다. )
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int dp[100001] = {};
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int N, K, w, v;
vector<pair<int, int>> list; // 무게와 가치
list.push_back(make_pair(1, 1));
cin >> N >> K;
for (int i = 0; i < N; i++) {
cin >> w >> v;
list.push_back(make_pair(w, v));
}
for (int i = 1; i <= N; i++) {
for (int j = K; j >= 1; j--) {
if (list[i].first <= j) {
dp[j] = max(dp[j], dp[j - list[i].first] + list[i].second);
}
}
}
cout << dp[K];
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 17837 : 새로운 게임2 - travelbeeee (0) | 2020.03.03 |
---|---|
[BOJ] 16195 : 1, 2, 3 더하기 9 - travelbeeee (0) | 2020.02.28 |
[BOJ] 17140 : 이차원 배열과 연산 - travelbeeee (0) | 2020.02.28 |
[BOJ] 17143 : 낚시왕 - travelbeeee (0) | 2020.02.27 |
[BOJ] 15683 : 드래곤 커브 - travelbeeee (0) | 2020.02.26 |