최대 점수 구하기(DFS)
문제
문제
이번 정보올림피아드대회에서 좋은 성적을 내기 위하여 현수는 선생님이 주신 N개의 문제를 풀려고 합니다. 각 문제는 그것을 풀었을 때 얻는 점수와 푸는데 걸리는 시간이 주어지게 됩 니다. 제한시간 M안에 N개의 문제 중 최대점수를 얻을 수 있도록 해야 합니다. (해당문제는 해당시간이 걸리면 푸는 걸로 간주한다, 한 유형당 한개만 풀 수 있습니다.)
입력
첫 번째 줄에 문제의 개수N(1<=N<=20)과 제한 시간 M(10<=M<=300)이 주어집니다. 두 번째 줄부터 N줄에 걸쳐 문제를 풀었을 때의 점수와 푸는데 걸리는 시간이 주어집니다.
출력
첫 번째 줄에 제한 시간안에 얻을 수 있는 최대 점수를 출력합니다.
입력예제 1
5 20
10 5
25 12
15 8
6 3
7 4
출력예제 1
41
해결방법
- 문제를 푼다 안푼다가 DFS 분기점으로 나뉨
- 계속 재귀로 넘어가면서 부분 집합을 만들어 내는 것이 핵심
코드
import java.util.*;
class Main {
static int answer = Integer.MIN_VALUE, n, m;
boolean flag = false;
public void DFS(int L, int sum, int time, int[] ps, int[] pt) {
// 시간 초과하면 끝.
if (time > m) return;
// 문제를 다 푼 경우, 정답을 비교하여 교체한다.
if (L == n) {
answer = Math.max(answer, sum);
} else {
// 해당 문제를 푼 것과 안푼 것으로 나뉘어 재귀를 돌린다.
DFS(L + 1, sum + ps[L], time + pt[L], ps, pt);
DFS(L + 1, sum, time, ps, pt);
}
}
public static void main(String[] args) {
Main.Main T = new Main.Main();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
m = kb.nextInt();
int[] a = new int[n];
int[] b = new int[n];
for (int i = 0; i < n; i++) {
a[i] = kb.nextInt();
b[i] = kb.nextInt();
}
T.DFS(0, 0, 0, a, b);
System.out.println(answer);
}
}