문제
이번 정보올림피아드대회에서 좋은 성적을 내기 위하여 현수는 선생님이 주신 N개의 문제를 풀려고 합니다. 각 문제는 그것을 풀었을 때 얻는 점수와 푸는데 걸리는 시간이 주어지게 됩니다. 제한시간 M안에 N개의 문제 중 최대점수를 얻을 수 있도록 해야 합니다. (해당문제는 해당시간이 걸리면 푸는 걸로 간주한다, 한 유형당 한개만 풀 수 있습니다.)
▣ 입력설명
첫 번째 줄에 문제의 개수N(1<=N<=50)과 제한 시간 M(10<=M<=300)이 주어집니다.
두 번째 줄부터 N줄에 걸쳐 문제를 풀었을 때의 점수와 푸는데 걸리는 시간이 주어집니다.
▣ 출력설명
첫 번째 줄에 제한 시간안에 얻을 수 있는 최대 점수를 출력합니다.
▣ 입력예제 1
5 20
10 5
25 12
15 8
6 3
7 4
▣ 출력예제 1
41
풀이
냅색 알고리즘으로 이전 문제 처럼 풀면된다. 주의 할 점은 한 문제는 한 번만 풀 수 있다는 것이다. 앞서 푼 동전교환문제는 동전을 무한정 쓸 수 있었지만 이 문제는 그렇지 않기 때문에, 중복회피를 위해서 뒤에서부터 반복문을 돌려야한다.
코드
import java.util.Scanner;
public class Main {
final static long mod = 1000000000;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(); //문제의 개수 1~50
int m = in.nextInt(); //제한시간 10~300
//제한시간 i 안에 얻을 수 있는 최대점수
int dy[] = new int[m+1];
dy[0] = 0;
for(int i=0; i<n; i++) {
int g = in.nextInt();//점수
int t = in.nextInt();//푸는데 걸리는 시간
//냅색 알고리즘, 중복 회피하기 위해서 뒤에서부터 순회
for(int j=m; j>=t; j--) {
dy[j] = Math.max(dy[j], dy[j-t] + g); //기존 값 보다 크면 바꿔준다
}
}
System.out.println(dy[m]);
}
}
'PS(Java) > 인프런 강의 문제' 카테고리의 다른 글
[PS] 인프런 강의 - Recursive 3. 팩토리얼 (0) | 2022.09.19 |
---|---|
[PS] 인프런 강의 - Recursive 2. 재귀함수를 이용한 이진수 출력 (0) | 2022.09.19 |
[PS] 인프런 강의 - Recursive 1. 재귀함수 (0) | 2022.09.19 |
[PS] 인프런 강의 - DP 5. 동전교환(냅색 알고리즘) (0) | 2022.09.15 |
[PS] 인프런 강의 - DP 4. 가장 높은 탑 쌓기 (0) | 2022.09.15 |