728x90
https://www.acmicpc.net/problem/1495
메모리: 14,784 KB , 시간: 116 ms
사용 알고리즘: 다이나믹 프로그래밍
728x90
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int S = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] V = new int[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
V[i] = Integer.parseInt(st.nextToken());
}
// 이미 구한 경우의 수는 다시 구하지 않기 위한 visited 배열
boolean[][] visited = new boolean[N][M + 1];
// 볼륨 조정 경우를 담은 큐
Queue<int[]> q = new ArrayDeque<>();
q.add(new int[] {-1, S}); // 처음 곡
int[] now; int next;
int result = -1;
while(!q.isEmpty()) {
now = q.poll();
if(now[0] == N - 1) {
result = Math.max(result, now[1]);
continue;
}
next = now[0] + 1;
// 볼륨을 줄이는 경우
if(now[1] - V[next] >= 0 && !visited[next][now[1] - V[next]]) { // 아직 확인 안 한 경우에만
visited[next][now[1] - V[next]] = true;
q.add(new int[] {next, now[1] - V[next]});
}
// 볼륨을 높이는 경우
if(now[1] + V[next] <= M && !visited[next][now[1] + V[next]]) {
visited[next][now[1] + V[next]] = true;
q.add(new int[] {next, now[1] + V[next]});
}
}
System.out.println(result);
}
}
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[백준, BOJ 8979] 올림픽 (java) (0) | 2024.10.05 |
---|---|
[백준, BOJ 10798] 세로읽기 (java) (0) | 2024.10.05 |
[백준, BOJ 16971] 배열 B의 값 (java) (1) | 2024.09.24 |
[백준, BOJ 2346] 풍선 터뜨리기 (java) (0) | 2024.09.22 |
[백준, BOJ 1181] 단어 정렬 (java) (0) | 2024.09.21 |