https://www.acmicpc.net/problem/12865
[필자 사고]
Dp문제이다.
Dp문제에서 핵심은 Dp를 어떻게 정의하느냐에 있다고 생각한다.
필자는 Dp[i][k] 라고 선언했고 k는 무게를 의미하며 i는 가방의 종류를 의미한다. Dp값은 최대 가치를 의미한다.
max(DP[i - 1][j], DP[i - 1][j - W[i]] + V[i])이 코드가 핵심이라고 생각한다.
현재의 가방의 최대치를 구하기 위해 먼저 해당 가방의 무게가 k를 넘지 않아야 된다.
다음으로 생각할 것은 현재 가방에 넣은 물건들의 가치 최대치이다.
1. 만약 해당 가방의 무게가 k보다 작은경우에서
이전 Dp[i-1][j] 의 가치가 높은지 아니면 Dp[i-1][j-W[i]]+V[i] 높은지 비교하는것이다.
2. k보다 큰경우는
Dp[i][j] = Dp[i-1][j] 를 넣어주면 된다.
[소스 코드]
#include <iostream>
#include <vector>
using namespace std;
int N, K;
vector<int> W;
vector<int> V;
vector<vector<int>> Dp;
void Input() {
cin >> N >> K;
W.resize(N+1 );
V.resize(N+1 );
Dp.resize(N+1 );
for (int i = 0; i <= N; i++) {
Dp[i].resize(K+1);
}
for (int i = 1; i <= N; i++) {
cin >> W[i] >> V[i];
}
}
void Solve() {
for (int i = 1; i <= N; i++) {
for (int k = 1; k <= K; k++) {
if (k >= W[i]) {
Dp[i][k] = max(Dp[i - 1][k], Dp[i - 1][k - W[i]] + V[i]);
}
else Dp[i][k] = Dp[i - 1][k];
}
}
}
int main(void) {
Input();
Solve();
cout << Dp[N][K];
}
'백준 > 동적프로그래밍' 카테고리의 다른 글
백준 1562 c++ "계단 수" -PlusUltraCode- (0) | 2024.12.26 |
---|---|
백준 c++ 1904 "01타일" -PlusUltraCode- (0) | 2024.05.10 |
백준 c++2749 "피보나치 수 3" -PlusUltraCode- (0) | 2024.05.08 |
백준 c++ 2748 "피보나치 수 2" -PlusUltraCode- (0) | 2024.05.08 |
백준 9461 c++ "파도반 수열" -PlusUltraCode- (0) | 2024.05.07 |