https://www.acmicpc.net/problem/2293
문제
n가지 종류의 동전이 있다. 각각의 동전이 나타내는 가치는 다르다. 이 동전을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그 경우의 수를 구하시오. 각각의 동전은 몇 개라도 사용할 수 있다.
사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다.
입력
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다.
출력
첫째 줄에 경우의 수를 출력한다. 경우의 수는 231보다 작다.
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
int[] dp = new int[K+1];
dp[0] = 1;
for (int i = 0; i < N; i++){
int coin = Integer.parseInt(br.readLine());
for (int j = coin; j <= K; j++){
dp[j] += dp[j - coin];
}
}
System.out.println(dp[K]);
}
}
1. 어려웠던 점:
- DP 점화식 작성
2. 알게된 점:
- DP 연습
- 점화식을 짜면서, 중복을 어떻게 제거할지 고민을 많이 했고, 이러한 방식에 대해 알아가게 되었다.
3. 알고리즘 풀이:
- dp배열은 각 값의 합이 되는 경우의 수를 의미한다.
점화식은 dp[i] += dp[i - coin]이 되는데, coin은 동전의 값이다.
처음 접근을 할 때는, 코인을 전부 받아온 후,
i를 순회하며 계산하려고 하였다.
그런 계산법을 가지니, 중복값을 제거하는 것이 매우 어려웠다.
하지만 코인의 값을 받을 때마다
처리하게 되면 자연히 중복값이 제거된다는 것을 깨달았다.
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준 1946] 신입 사원 with JAVA (0) | 2021.06.26 |
---|---|
[백준 2529] 부등호 with JAVA (0) | 2021.06.25 |
[백준 7562] 나이트의 이동 with JAVA (0) | 2021.06.24 |
[백준 11724] 연결 요소의 개수 with JAVA (0) | 2021.06.23 |
[백준 18222] 투에-모스 문자열 with JAVA (0) | 2021.06.23 |