최대점수 구하기

코드
package dynamic;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
/**
* 최대점수 구하기(냅색 알고리즘)
*/
public class Dynamic5 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");
int N = Integer.parseInt(str[0]); // 문제의 개수
int M = Integer.parseInt(str[1]); // 풀이 시간
int[] dy = new int[M + 1]; // 각 인덱스는 시간
StringTokenizer st;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
int ps = Integer.parseInt(st.nextToken());
int pt = Integer.parseInt(st.nextToken());
for (int j = M; j >= pt; j--) {
dy[j] = Math.max(dy[j], dy[j - pt] + ps);
}
}
System.out.println(dy[M]);
}
}
※ 풀이
- 동전 교환처럼 자원이 무한정 있는 경우는 j가 앞에서 부터 움직이고, 위 문제처럼 개수가 유한정 정해진 경우 j는 뒤에서 부터 움직인다. (중복 제거 위해)
- dy[ j ]는 j 분 동안 풀 수 있는 최대 점수를 저장한다.
'알고리즘' 카테고리의 다른 글
| 동전교환(Dynamic Programing) (0) | 2024.04.23 |
|---|---|
| 가장 높은 탑 쌓기(Dynamic Programing) (0) | 2024.04.23 |
| 최대 부분 증가수열(Dynamic Programing) (0) | 2024.04.23 |
| 계단 오르기(Dynamic Programing) (0) | 2024.04.23 |