https://www.acmicpc.net/problem/14501
14501번: 퇴사
첫째 줄에 백준이가 얻을 수 있는 최대 이익을 출력한다.
www.acmicpc.net
- 풀이방법[알고리즘]
백준이가 퇴사하기 전까지 가장 많은 돈을 벌 수 있는 경우를 계산해야 하는 문제. 백트래킹 완전 탐색으로 풀 수 있는 문제이다. 상담을 받으면 해당 상담이 걸리는 날과 벌 수 있는 돈을 더해서 다음 상담 가능한 날로 점프하고, 받지 않으면 그대로 날짜만 +1해준다. 처음엔 생각없이 0번째 날을 무조건 넣어서 4번 예제에서 틀렸다. 0번째 날을 포함하지 않는 경우의 수도 계산해야 하기 때문에 date+1의 값을 넣어서 dfs를 구해주면 최대 벌이를 구할 수 있는 식이 나온다.
import java.util.*;
import java.io.*;
public class 퇴사 {
static int N,answer;
static ArrayList<Left> arr;
public static void main(String[] args)throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
arr = new ArrayList();
answer = Integer.MIN_VALUE;
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
arr.add(new Left(Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken())));
}
dfs(0,0);
System.out.println(answer);
}
static void dfs(int date,int sum) {
if(date>=N) {
answer = Math.max(answer, sum);
return;
}
Left tmp=arr.get(date);
if(date+tmp.T>N) {
dfs(date+1,sum);
}else {
dfs(date+tmp.T,sum+tmp.P);
}
//첫번째 값을 넣는다고 무조건 되는게 아니니까 그 다음값부터 넣는것도 해봐야함!!!
dfs(date+1,sum);
}
static class Left{
int T,P;
public Left(int T, int P) {
this.T = T;
this.P =P;
}
public String toString() {
return T+"&"+P;
}
}
}
'알고리즘 문제 > JAVA' 카테고리의 다른 글
[백준]17144번: 미세먼지 안녕!(JAVA) (1) | 2023.10.09 |
---|---|
[백준]10226번: 적록색약(JAVA) (1) | 2023.10.08 |
[SWEA]5215번:햄버거 다이어트(JAVA) (1) | 2023.04.07 |
[백준]13458번:시험 감독(JAVA) (1) | 2023.01.09 |
[SWEA]14510번:나무 높이(JAVA) (0) | 2022.12.02 |