https://www.acmicpc.net/problem/2624
2624번: 동전 바꿔주기
명보네 동네 가게의 현금 출납기에는 k 가지 동전이 각각 n1, n2, … , nk개 씩 들어있다. 가게 주인은 명보에게 T원의 지폐를 동전으로 바꿔 주려고 한다. 이때, 동전 교환 방법은 여러 가지가 있을
www.acmicpc.net
저는 DP를 통해 문제를 해결하였습니다.
DP[돈][index]를 통해 해당 돈으로 해당 인덱스의 돈까지 사용하여 몇가지의 경우가 있는지를 저장하여 똑같은 계산을 다시 하지 않도록 하였습니다.
package BOJ.dp;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
import java.util.function.Function;
public class BOJ_2624 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Function<String,Integer> stoi = Integer::parseInt;
int money = stoi.apply(br.readLine());
int n = stoi.apply(br.readLine());
int[][] input = new int[n][2];
for(int i = 0 ; i < n ; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
input[i][0] = stoi.apply(st.nextToken());
input[i][1] = stoi.apply(st.nextToken());
}
int[][] dp = new int[money+1][n];
for(int i = 0 ; i <= money ; i++){
Arrays.fill(dp[i],NOT_VALID);
}
int result = cal(money,n-1,input,dp);
System.out.println(result);
}
private static final int NOT_VALID = -1;
private static int cal(int money, int index,int[][]input, int[][] dp){
if(money == 0){
return 1;
}
if(index < 0){
return 0;
}
if(dp[money][index] != NOT_VALID){
return dp[money][index];
}
int result = 0;
for(int i = 0 ; i <= input[index][1] ; i++){
int remainder = money - input[index][0] * i;
if(remainder >= 0){
result += cal(remainder,index-1,input,dp);
}
}
return dp[money][index] = result;
}
}
'알고리즘' 카테고리의 다른 글
프로그래머스 H-index(JAVA) (0) | 2022.09.18 |
---|---|
백준 13422번 도둑 (JAVA) (0) | 2022.09.17 |
백준 11058번 크리보드 (JAVA) (0) | 2022.09.15 |
프로그래머스 단어 변환 (JAVA) (0) | 2022.09.14 |
프로그래머스 야근 지수 (JAVA) (0) | 2022.09.13 |