https://www.acmicpc.net/problem/12865
준서는 N개의 물건 (W1, V1), (W2, V2), …, (Wn, Vn)
을 가지고 있다.
각 물건은 무게 W
와 가치 V
를 가지며, 준서의 배낭에는 최대 무게 K
까지만 담을 수 있다.
목표는 배낭에 넣을 수 있는 물건들의 가치 합의 최댓값을 구하는 것이다.
문제를 풀기 위해 **DP(동적 계획법)**을 사용한다.
예를 들어 배낭의 용량이 7
이라고 해보자.
만약 첫 번째 물건 (6, 13)
을 담으면 남은 용량은 1
, 총 가치는 13
이 된다.
담지 않으면 그대로 용량 7
, 가치 0
이다.
이때 dp[x]
를 용량이 x일 때 얻을 수 있는 최대 가치라고 정의하자.
예를 들어 (6, 13)
을 담는 경우,
dp[7]
의 후보는 dp[1] + 13
이 된다.
하지만 (6, 13)
을 담지 않는 경우가 더 클 수도 있으므로, 항상 최댓값을 취한다.
즉, 각 물건을 고려할 때
dp[W] = max(dp[W], dp[W-w] + v)
와 같이 갱신한다. (단, W >= w
)
초기:
dp = [0,0,0,0,0,0,0,0] // 인덱스 0..7
(6,13) 처리 (W=7..6)
W=7: dp[7] = max(0, dp[1]+13=13) = 13
W=6: dp[6] = max(0, dp[0]+13=13) = 13
→ dp = [0,0,0,0,0,0,13,13]
(4,8) 처리 (W=7..4)
W=7: dp[7] = max(13, dp[3]+8=8) = 13
W=6: dp[6] = max(13, dp[2]+8=8) = 13
W=5: dp[5] = max(0, dp[1]+8=8) = 8
W=4: dp[4] = max(0, dp[0]+8=8) = 8
→ dp = [0,0,0,0,8,8,13,13]
(3,6) 처리 (W=7..3)
W=7: dp[7] = max(13, dp[4]+6=8+6=14) = 14 ✅
W=6: dp[6] = max(13, dp[3]+6=0+6=6) = 13
W=5: dp[5] = max(8, dp[2]+6=0+6=6) = 8
W=4: dp[4] = max(8, dp[1]+6=0+6=6) = 8
W=3: dp[3] = max(0, dp[0]+6=6) = 6
→ dp = [0,0,0,6,8,8,13,14]
(5,12) 처리 (W=7..5)
W=7: dp[7] = max(14, dp[2]+12=0+12=12) = 14 (유지)
W=6: dp[6] = max(13, dp[1]+12=12) = 13
W=5: dp[5] = max(8, dp[0]+12=12) = 12
→ dp = [0,0,0,6,8,12,13,14]
최종적으로 dp[7] = 14
가 답이다.
dp[W]
= 용량 W
일 때 최대 가치(w,v)
에 대해 W
를 내림차순으로 갱신dp[K]
#include <iostream>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, k;
cin >> n >> k;
vector<pair<int, int>> items;
items.reserve(n);
for (int i=0; i<n; i++) {
int w, v;
cin >> w >> v;
items.push_back({w, v});
}
vector<int> dp(k+1, 0);
for (auto &p: items) {
int w = p.first;
int v = p.second;
for (int W = k; W >= w; --W) {
dp[W] = max(dp[W], dp[W-w] + v);
}
}
cout << dp[k] << '\n';
return 0;
}