https://www.acmicpc.net/problem/17845
풀이
과목들의 공부시간과 중요도가 주어진다.
자신의 한계 공부 시간을 넘지 않으면서 중요도의 합이 최대가 되도록 과목들을 선택해야 한다.
문제를 보자마자 배낭 문제라고 떠올랐다.
배낭에 담을 수 있는 무게의 최댓값이 정해져 있고, 일정 무게의 짐들을 배낭에 넣을 때 가치의 합이 최대가 되도록 하는 배낭 문제에서 말만 바꾼 문제였다.
과목들의 정보를 배열에 담고, 최대 n의 시간에 맞춰 과목들을 dp배열에 담았다.
메모리: memoryKB
시간: speedms
언어: Java 11
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
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[][] subject = new int[k + 1][2];
for (int i = 1; i < k + 1; i++) {
st = new StringTokenizer(br.readLine());
subject[i][0] = Integer.parseInt(st.nextToken());
subject[i][1] = Integer.parseInt(st.nextToken());
}
int[][] dp = new int[k + 1][n + 1];
for (int i = 1; i < k + 1; i++) {
int importance = subject[i][0];
int time = subject[i][1];
for (int j = 1; j < n + 1; j++) {
if (time <= j) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - time] + importance);
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
System.out.println(dp[k][n]);
}
}
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준] 15671: 오델로 - JAVA (0) | 2024.08.13 |
---|---|
[백준] 20208: 진우의 민트초코우유 - JAVA (0) | 2024.07.19 |
[백준] 20917: 사회적 거리 두기 (0) | 2024.07.18 |
[백준] 10282: 해킹 - JAVA (0) | 2024.07.18 |
[백준] 19542: 전단지 돌리기 - JAVA (0) | 2024.07.13 |
[백준] 25195: Yes or yes - JAVA (0) | 2024.07.13 |