키워드
- 카드팩의 종류는 카드 1개가 포함된 카드팩, 카드 2개가 포함된 카드팩, ... 카드 N개가 포함된 카드팩과 같이 총 N가지가 존재
- 민규는 돈을 최대한 많이 지불해서 카드 N개 구매하려고 한다.
- 카드가 i개 포함된 카드팩의 가격은 P_i원
구현
static int dp(int count)
현재 count개의 카드를 샀을 때, N개를 샀을 때 금액의 최대값을 반환하는 메소드
- count == N 인 경우
- N개를 전부 샀으므로, 더 살 수 없기 때문에 0을 반환한다.
- cache[count] ≠ -1 인 경우
- 캐시 값이 이미 존재하므로 cache값을 반환한다.
- 카드팩 배열을 돌면서 하나의 팩을 선택한다.
- 해당 카드팩을 살 수 있는지 확인한다.
- 살 수 있다면 → 현재 캐시값과 현재카드팩을 구매했을 때 금액의 최대값 중 하나를 선택한다.
- 해당 카드팩을 살 수 있는지 확인한다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class java_11052 {
// 구매하려는 카드의 개수
static int N;
static int P[];
// 캐시
static int cache[];
// 현재 count개의 카드를 샀을 때, N개를 채웠을 때 금액의 최댓값 반환
static int dp(int count) {
// N개가 된 경우, 더 살 수 없다.
if (count == N) {
return 0;
}
// 이미 값이 존재한다면..이를 사용
if (cache[count] != -1) {
return cache[count];
}
cache[count] = 0;
// 카드팩 배열을 돌면서 하나를 선택한다.
for (int i = 0; i < P.length; i++) {
// 해당 카드팩을 살 수 있는가?
// 살 수 없는 경우
if (count + (i + 1) > N) {
continue;
}
// 살 수 있는 경우 -> 더 큰 값을 저장
cache[count] = Math.max(cache[count], P[i] + dp(count + (i + 1)));
}
return cache[count];
}
static int solution() {
// 캐시 초기화
cache = new int[N];
Arrays.fill(cache, -1);
int result = dp(0);
return result;
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
P = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
P[i] = Integer.parseInt(st.nextToken());
}
int result = solution();
System.out.println(result);
br.close();
}
}
Uploaded by N2T
'Coding Test > BOJ' 카테고리의 다른 글
[BOJ/JAVA] 1351번: 무한 수열 (0) | 2023.02.13 |
---|---|
[BOJ/JAVA] 2302번: 극장 좌석 (0) | 2023.02.13 |
[BOJ/JAVA] 5557번: 1학년 (0) | 2023.02.13 |
[BOJ/JAVA] 1612번: 가지고 노는 1 (0) | 2023.02.07 |
[BOJ/JAVA] 1644번: 소수의 연속합 (0) | 2023.02.07 |