최대 점수 구하기(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);
    }
}


© 2024. Chiptune93 All rights reserved.