본문 바로가기
알고리즘 이전/DP

최대점수 구하기(냅색)

by hoshi03 2023. 9. 11.

N개의 문제를 풀려고 합니다.각 문제는 그것을 풀었을 때 얻는 점수와 푸는데 걸리는 시간이 주어지게 됩니다.

제한시간 M안에 N개의 문제 중 최대점수를 얻을 수 있도록 해야 합니다.

(해당문제는 해당시간이 걸리면 푸는 걸로 간주한다, 한 유형당 한개만 풀 수 있습니다.)

 

첫 번째 줄에 문제의 개수와 제한 시간이 주어집니다.

두 번째 줄부터 N줄에 걸쳐 문제를 풀었을 때의 점수와 푸는데 걸리는 시간이 주어집니다.

첫 번째 줄에 제한 시간안에 얻을 수 있는 최대 점수를 출력

 

입력

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

출력 41

 

dp로 문제를 풀때 넣을수 있는 물건의 갯수가 정해져 있으면 뒤에서 부터 시작한다,

9/11 클래스가 없이 2차원 배열을 사용하는 방법으로 다시 풀어보자

import java.util.*;

class Problem implements Comparable<Problem>{
    int score;
    int time;
    Problem(int score, int time){
        this.score = score;
        this.time = time;
    }

    @Override
    public int compareTo(Problem o) {
        return this.time - o.time;
    }
}

class Main {
    static int n,m;
    static int[] dy;
    public static void main(String[] args){
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        m= in.nextInt();
        dy = new int[m+1];
        ArrayList<Problem> arr = new ArrayList<>();
        for (int i = 0; i < n; i++) arr.add(new Problem(in.nextInt(), in.nextInt()));
//        Collections.sort(arr);
        for (Problem x : arr){
            for (int j =m; j >= x.time; j--){
                int tmp = dy[j-x.time] + x.score;
                dy[j] = Integer.max(tmp, dy[j]);
            }
        }
        int cnt = 0;
        System.out.println(dy[m]);
    }
}

 

'알고리즘 이전 > DP' 카테고리의 다른 글

동전교환(냅색)  (0) 2023.09.10
가장 높은 탑 쌓기(LIS)  (0) 2023.09.09
최대 부분 증가수열(LIS)  (1) 2023.09.09
계단 오르기, 돌다리 건너기  (0) 2023.09.09