#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> v;
int visited[15] = { 0, };
int sum = 0;
int cur;
int n;
void dfs(int cnt, int cur)
{
// cnt가 n 이 되면 중단 후 최대값 비교
if (cnt == n)
{
sum = max(sum, cur);
return;
}
// 하면 더하고
if (visited[cnt] != 1 && v[cnt][0] <= n - cnt)
{
for (int i = cnt; i < cnt + v[cnt][0]; i++)
{
visited[i] = 1;
}
dfs(cnt + 1, cur + v[cnt][1]);
for (int i = cnt; i < cnt + v[cnt][0]; i++)
{
visited[i] = 0;
}
}
// 안하면 안더하고
dfs(cnt + 1, cur);
}
int main()
{
// 모든 경우를 해봐야 하기 때문에 dfs로 구성함.
// visited 를 통해 일을 한 기간만큼 visited를 체크해서 방문하지 않도록 함.
cin >> n;
for (int i = 0; i < n; i++)
{
int temp;
vector<int> t;
cin >> temp;
v.push_back(t);
v[i].push_back(temp);
cin >> temp;
v[i].push_back(temp);
}
dfs(0, 0);
cout << sum;
return 0;
}
간단하게 생각해서
- 당일 일을 하는 경우
- 당일 일을 안하는 경우
로 나눠서 접근해봤다.
일을 한다면 일을 할 때 소요되는 시간은 visited 배열로 체크를 해준다.
- 당일 일을 하는 경우
1.내가 전날의 일을 하는중이 아니고 ( visited 가 0이고 )
2.일을 하는데 걸리는 시간이 퇴사 전에 끝 낼 수 있으면
일을 할 수 있다.
- 당일 일을 안 하는 경우
아무것도 안하고 다음날로 넘어간다.
처음에는 걸리는 시간과 퇴사의 관계를 생각하지 않았고
for문으로 모든 일을 다 돌아야 된다는 강박에 좀 걸렸지만
단순하게 생각해보면 쉽게 넘어가는 문제이다.
DP로도 해결할 수 있는 방법이 있어서 그 방법도 해보겠다.