Algorithm 문제 & 공부/완전탐색
백준 14501 파이썬 - 퇴사
somm12
2022. 9. 30. 12:29
14501번: 퇴사
첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.
www.acmicpc.net
최근에 순열 또는 조합 문제를 재귀로 푸는 연습을 하다보니, 이 문제에서도 비슷하게 적용했더니 답이 이상하게 나왔다.
그 이유가. 재귀 함수에서 재귀 호출을 for 반복문 내 에서 해서, 마치 순열 처럼 다음 인덱스를 바로 적용하는 것처럼 구현해서 답이 이상했던 것이었따.. ㅠ
상담기간이 1일이 아니기 때문에, 1일날 상담을 한다해도 그 다음날인 2일날에는 상담을 못할 수 있기 때문에, 순열과 다르게 중간 중간 뛰어넘기는 문제인다. 근데, 나는 처음에 순열처럼 풀었던 것이다..하하 평소보다 이른 아침 일찍 풀어서 그런지 미흡했다...
풀이
day: 재귀 함수 dfs 매개변수로, 해당 일을 뜻하는 index.
total: 재귀 함수 dfs 매개변수로, 현재 상담까지의 총 가격
ex) 1 째날 의 상담기간이 3일 이라면 다음 재귀함수 호출: dfs( 1일 + t[1], total + p[1] )
포인트 : 상담을 할 수도 있고, 안할 수도 있다.
- 상담을 할 경우: dfs(day + t[day], total + p[day])
- 상담을 안하는 경우: dfs(day + 1, total) => 선택안하고 넘기는 것이기 때문에 날짜만 +1 해준다.
index 보통 0부터 시작하는데 1일 2일 숫자를 신경쓰고 싶지않아서 위의 그럼처럼 0일부터 시작하는 것으로 간주했다.
코드
import sys
input = sys.stdin.readline
n = int(input())
p = []
t = []
ans = -1
def quit(day, total):
global ans
if day > n:
return
if day == n:
ans = max(ans, total)
else:
quit(day + t[day], total + p[day])
quit(day + 1, total)
for _ in range(n):
a, b = map(int, input().split())
t.append(a)
p.append(b)
quit(0,0)
print(ans)