📝 문제
📌 풀이
- 2차원 DP배열을 이용하여 행은 체력을 의미하고 열은 해당 사람까지의 최대 기쁨을 의미한다.
- 행을 하나씩 늘려가며 체력이 증가할 때마다의 최대 기쁨을 계산한다.
- 체력이 해당 행 인덱스 값일 때 각각의 사람을 순회하면서 최대 기쁨을 계산한다.
- 우선 해당 열의 사람을 안을 수 있는지 판단한다.
- 안을 수 있다면 안고 남은 체력으로 이전 사람까지 나올 수 있는 DP를 더한 값과 안지 않은 경우 중 최대 값을 저장한다.
- 안을 수 없다면 안지 않은 경우 값을 저장한다.
- 최종적으로 체력이 99인 경우 가장 마지막 사람까지 순회한 값인 DP[99][N]의 값이 정답이다.
💻 코드
#include <iostream>
using namespace std;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int W[21] = { 0 };
int V[21] = { 0 };
int DP[100][21] = { 0 };
int N;
cin >> N;
for (int i = 1; i <= N; i++) {
cin >> W[i];
}
for (int i = 1; i <= N; i++) {
cin >> V[i];
}
for (int i = 1; i <= 99; i++) {
for (int j = 1; j <= N; j++) {
if (i >= W[j]) {
DP[i][j] = max(V[j] + DP[i - W[j]][j - 1], DP[i][j - 1]);
}
else {
DP[i][j] = DP[i][j - 1];
}
}
}
cout << DP[99][N] << '\n';
return 0;
}