250x250
반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 자료해석
- NCS수리자료해석
- 자바스크립트
- 공기업공부
- 수리능력
- 토익단어
- 데이터베이스
- BOJ
- 영문법
- 주어
- 브루트포스
- 토익문법정리
- 영단어
- 토익 영단어
- 너비우선탐색
- 알고리즘
- 영어문장
- 토익시험준비
- 토익문법노트
- TOEIC
- BFS
- 다이나믹프로그래밍
- 문제해결능력
- dfs
- sqld
- TOEIC문법
- TOEIC Vocabulary
- 영단어암기
- 매일매일NCS
- 파이썬
Archives
- Today
- Total
하나씩 알아가기
[BOJ_14501] 퇴사 본문
728x90
반응형
재귀를 이용한 브루트 포스 문제입니다.
N+1일째 되는 날 퇴사를 해야하는데, 남은 N일 동안 최대한 많이 상담하여 얻을 수 있는 이익을 구해야 합니다.
우선 Ti와 Pi가 있는데 각각 상담을 하는 데 걸리는 시간과 상담으로 인해 얻는 이익을 의미하는 일차원 배열입니다.
재귀로 풀려면 재귀 함수를 구현해야 하는데 이는 우선 정답을 찾은 경우, 찾지 못하는 경우, 그 다음 케이스(재귀)로 구현됩니다.
먼저 정답을 찾은 경우는 n+1일이 되는 경우입니다. 이 경우 반환되는 값이 기존의 이익(profit)보다 더 높을 경우 갱신하고 종료(return;)해 줍니다.
그리고 다음 분기는 정답을 찾지 못하는 경우입니다. 이 경우는 그냥 종료하는데 바로 day가 n+1을 초과할 때 입니다.
마지막으로 다음 경우를 호출할 때 입니다. 상담을 하는 경우와 하지 않는 경우 두 번 호출해 줍니다.
- 상담을 하는 경우 : go(day+t[day], sum+p[day])
- 상담을 하지 않는 경우 : go(day+1, sum+0)
그냥 별다른 처리 없이 함수만 두 번 호출해서 조금 의아할 수 있지만 이러면 재귀를 도는 과정에서 알맞은 케이스를 다 적용해서 최대 profit을 얻을 수 있고 출력하면 됩니다.
정말 간단한 재귀 문제였습니다.
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n;
int profit = 0;
int t[16];
int p[16];
void go(int day, int sum) {
if (day == n + 1) {
if (profit < sum)
profit = sum;
return;
}
if (day > n + 1) {
return;
}
go(day + 1, sum);
go(day + t[day], sum + p[day]);
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> t[i] >> p[i];
}
go(1, 0);
cout << profit << '\n';
return 0;
}
728x90
반응형