반응형
문제 : https://www.acmicpc.net/problem/14501
서론
DP문제. 재귀를 이용해서 풀이.
풀이
완전탐색이랑 유사하게 구현했는데 다만 모든 경우의 수를 탐색하지는 않고 최대값이 나올만한 경우의 수만 탐색한다.
예제에서 1일에 일한 후 면 4일과 5일에도 일을 하지 1일만 일하고 끝내는 경우는 나오지 않는다. 즉 일할 수 있는 최대한으로 일한다.
void dfs(int idx, int sum) { // idx = 날짜
if (idx > n) {
result = max(result, sum);
return;
}
// 현재 날짜에선 일을 하지 않음, sum을 그대로 넘겨줌
dfs(idx + 1, sum);
// 현재 날짜에서 일을 함, 다음 idx는 T만큼 이동해야함, sum에 P를 더해줌
if (idx + table[0][idx] <= n + 1) dfs(idx + table[0][idx], sum + table[1][idx]);
return;
}
구현
// c++
#include <algorithm>
#include <iostream>
using namespace std;
int table[2][16];
int n;
int result;
void init() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> table[0][i] >> table[1][i];
}
}
void dfs(int idx, int sum) {
//cout << idx << endl;
if (idx > n) {
result = max(result, sum);
//cout << sum << endl;
return;
}
dfs(idx + 1, sum);
if (idx + table[0][idx] <= n + 1) dfs(idx + table[0][idx], sum + table[1][idx]);
return;
}
int main() {
init();
dfs(1, 0);
cout << result;
}
최근댓글