Post

DFS, 부분집합, 최대점수 구하기

✅ n개의 문제를 제한시간 내에 풀어 최대 점수 얻기

제한시간 m안에 n개의 문제 중 최대점수를 얻을 수 있도록 해야 합니다.
첫 줄에 문제의 개수 n과 제한시간 m이 주어집니다.
두 번째 줄부터 n줄에 걸쳐 문제를 풀었을 때 점수와 푸는 시간이 주어집니다.

✔️ input & output

1
2
3
4
5
6
7
8
5 20
10 5
25 12
15 8
6 3
7 4

//output: 41

🟢

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Main {
    static int n;
    static int m;
    static int answer;
    static int[] scoreArr;
    static int[] timeArr;
    public void DFS(int L, int score, int time) {
        if(time>m) return;
        if(L==n) answer= Math.max(score, answer);
        else{
            DFS(L+1, score+scoreArr[L], time+timeArr[L]);
            DFS(L+1, score, time);
        }

    }

    public static void main(String[] args) {
        Main T = new Main();
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        scoreArr= new int[n];
        timeArr= new int[n];
        for(int i=0; i<n; i++){
            scoreArr[i]= sc.nextInt();
            timeArr[i] = sc.nextInt();
        }
        T.DFS(0, 0, 0);
        System.out.print(answer);
    }
}


이 문제도 부분집합에 포함 될지/ 안 포함될지 푸는 문제이다.
즉, 문제를 풀지/ 안 풀지 를 가지고 해결하는 문제 유형


DFS 함수에 레벨, 점수, 시간을 인자로 주고
문제를 풀면 레벨++, 점수 올라가고, 시간 올라가고
문제를 안 풀면 레벨만 ++

⭐️ 입력을 어떻게 처리할지 고민이었는데
저렇게 두 줄이 들어오면 2차원 배열로? 리스트로? ❌
각각 배열로 받아도 된다. ⭕️
그래서 점수를 저장하는 배열, 시간을 저장하는 배열을 따로 두기

This post is licensed under CC BY 4.0 by the author.