728x90
문제
유니스트 컴퓨터공학과에 다니는 서윤이는 이번에 어떤 과목을 들을지 고민중이다. 학점을 잘 받을 수 있으면서도 중요한 과목을 듣고 싶은 서윤이는 모든 과목의 중요도와, 일정 이상의 학점을 받기 위해 필요한 공부시간을 다 적었다.
처음에는 모든 과목을 들으려고 했던 서윤이는 자신의 공부 시간에 한계가 있다는 것을 깨달았다. 그래서, 공부 시간의 한계를 초과하지 않으면서 과목의 중요도 합이 최대가 되도록 몇 개만 선택하여 수강하기로 마음먹었다.
중요도가 최대가 되도록 과목을 선택했을 때, 최대가 되는 중요도를 출력하는 프로그램을 작성하시오.
입력
첫줄에 서윤이의 최대 공부시간 N (1 ≤ N ≤ 10,000), 과목 수 K (1 ≤ K ≤ 1,000)이 공백을 사이에 두고 주어진다.
이후 K개의 줄에 중요도 I (1 ≤ I ≤ 100,000), 필요한 공부시간 (1 ≤ T ≤ 10,000)이 공백을 사이에 두고 주어진다.
출력
얻을 수 있는 최대 중요도를 출력한다.
해결 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int dp[][] = new int[K+1][N+1];
for(int i=1;i<=K;i++){
st = new StringTokenizer(br.readLine());
int I = Integer.parseInt(st.nextToken());
int T = Integer.parseInt(st.nextToken());
for(int time=1; time<T && time <=N;time++){
dp[i][time] = dp[i-1][time];
}
for(int time=T;time<=N;time++){
dp[i][time] = Math.max(dp[i-1][time - T] + I,dp[i-1][time]);
}
}
System.out.println(dp[K][N]);
}
}
실행 결과
팁
- 최대값은 DP, 그리디, 완탐 중 하나이다.
'알고리즘 문제 풀이 > 해결코드' 카테고리의 다른 글
[백준 - 13910][GOLD 5][해설 X] - 개업 (JAVA) (0) | 2024.05.29 |
---|---|
[백준 - 13144][GOLD 4][해설 X] - List of Unique Numbers (JAVA) (0) | 2024.05.29 |
[백준 - 20159][GOLD 4][해설 X] - 동작 그만. 밑장 빼기냐? (JAVA) (0) | 2024.05.23 |
[백준 - 14925][GOLD 4][해설 X] - 목장 건설하기(JAVA) (0) | 2024.05.23 |
[백준 - 13422][GOLD 4][해설 X] - 도둑 (JAVA) (0) | 2024.05.21 |