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 |