728x90
https://www.acmicpc.net/problem/2624
728x90
메모리: 18,796 KB , 시간: 164 ms
사용 알고리즘: 다이나믹 프로그래밍
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
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;
int T = Integer.parseInt(br.readLine());
int k = Integer.parseInt(br.readLine());
int[][] coin = new int[k][2];
long[][] dp = new long[T + 1][k];
Arrays.fill(dp[0], 1);
for (int i = 0; i < k; i++) {
st = new StringTokenizer(br.readLine());
coin[i][0] = Integer.parseInt(st.nextToken());
coin[i][1] = Integer.parseInt(st.nextToken());
}
Arrays.sort(coin, (o1, o2) -> o1[0] - o2[0]);
// 가장 작은 금액의 동전의 경우는 미리 구해놓기
int p = coin[0][0], c = 1;
while(c <= coin[0][1] && p * c <= T) {
dp[p * c][0]++;
c++;
}
for (int i = 1; i < k; i++) { // 동전 순서대로 확인
// 현재 동전의 금액
p = coin[i][0];
for (int j = 1; j <= T; j++) { // 만들고자 하는 금액
c = 0;
while((c <= coin[i][1]) && (j - p * c >= 0)) {
dp[j][i] += dp[j - p * c][i - 1];
c++;
}
}
}
System.out.println(dp[T][k - 1]);
}
}
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[백준, BOJ 2228] 구간 나누기 (java) (0) | 2024.05.02 |
---|---|
[백준, BOJ 1561] 놀이 공원 (java) (0) | 2024.05.02 |
[백준, BOJ 2613] 숫자구슬 (java) (0) | 2024.04.30 |
[백준, BOJ 5557] 1학년 (java) (0) | 2024.04.19 |
[백준, BOJ 1414] 불우이웃돕기 (java) (0) | 2024.04.19 |