동적 프로그래밍 문제인 동전 1이다.
dp[K]에는 가치가 K일 때 경우의 수를 저장한다.
N만큼 주어진 동전의 가치 별로
K를 만드는 경우의 수를 구해서
dp배열에 누적합을 시켜준다.
동전 문제의 특징인 누적합을 시켜준다는 포인트를 생각해서
점화식을 생각해보면
1
2
3
4
5
6
|
for(int i=1; i<=n; i++) {
for(int j=coins[i]; j<=k; j++) {
dp[j] += dp[j-coins[i]];
}
}
|
이처럼 점화식이 나올 수 있다.
dp[0]에는 아예 동전을 안사용하는 경우가 있으므로
dp[0] = 1이다.
예제의 경우에 dp 배열을 살펴보면
coins[1] = 1
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
coins[2] = 2
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 2 | 2 | 3 | 3 | 4 | 4 | 5 | 5 | 6 |
coins[3] = 5
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
1 | 2 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 10 |
이처럼 동전의 가치별로 경우의 수가 더해진다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Q2293 {
public static void main(String[] args) throws IOException{
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(reader.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
int[] coins = new int[n+1];
int[] dp = new int[k+1];
dp[0] = 1;
for(int i=1; i<=n; i++) {
coins[i] = Integer.parseInt(reader.readLine());
}
for(int i=1; i<=n; i++) {
for(int j=coins[i]; j<=k; j++) {
dp[j] += dp[j-coins[i]];
}
}
System.out.println(dp[k]);
}
}
|
'Algorithm' 카테고리의 다른 글
백준 14500 테트로미노 Java (0) | 2019.09.11 |
---|---|
2019 KAKAO 매칭 점수 Java (0) | 2019.09.06 |
2019 KAKAO 후보키 Java (0) | 2019.08.27 |
2019 KAKAO 실패율 Java (0) | 2019.08.26 |
백준 17136 색종이 붙이기 Java (0) | 2019.08.23 |