백준 2294번 동전 2 (자바)
출처
2294번: 동전 2
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주
www.acmicpc.net
문제
n가지 종류의 동전이 있다. 이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그러면서 동전의 개수가 최소가 되도록 하려고 한다. 각각의 동전은 몇 개라도 사용할 수 있다.
사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다.
입력
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어질 수도 있다.
출력
첫째 줄에 사용한 동전의 최소 개수를 출력한다. 불가능한 경우에는 -1을 출력한다.
입출력 예

접근 방법
기존 동전 1 문제에서 사용했던 방법을 이용해 동전의 최소 개수를 구하면 된다.
최소 개수를 구하는 것이기 때문에 min 함수를 사용하고, 각 경우마다 +1을 하여 값을 비교한다.
점화식 : dp[j] = min(dp[j], dp[j-coin[i]] + 1)
내 코드
package dynamicprogramming; | |
import java.io.BufferedReader; | |
import java.io.IOException; | |
import java.io.InputStreamReader; | |
import java.util.Arrays; | |
import java.util.StringTokenizer; | |
public class Coin2 { | |
/** | |
* 백준 2294 동전2 (https://www.acmicpc.net/problem/2294) | |
*/ | |
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[] coin = new int[n+1]; | |
for (int i=1; i<=n; i++) { | |
coin[i] = Integer.parseInt(reader.readLine()); | |
} | |
int[] dp = new int[k+1]; | |
Arrays.fill(dp, Integer.MAX_VALUE-1); | |
dp[0] = 0; | |
//0일땐 동전 개수 0 | |
//개수 셀 때 +1을 해주기 때문에 1을 넣어놓을 필요가 없다. | |
//ex) 15원 개수 구할 때, 5원 3개 || 12원 1개 1원 3개 -> min 함수 필요 | |
for (int i=1; i<=n; i++) { | |
for (int j=coin[i]; j<=k; j++) { | |
dp[j] = Math.min(dp[j], dp[j-coin[i]] + 1); | |
} | |
} | |
if (dp[k] == Integer.MAX_VALUE-1) { | |
System.out.println(-1); | |
} else { | |
System.out.println(dp[k]); | |
} | |
} | |
} | |
고려할 점
1. 규칙을 찾아 점화식을 세울 것
2. 직접 써보며 규칙을 찾을 것
3. 동전 공식을 사용할 것
'알고리즘 > 백준' 카테고리의 다른 글
[백준 14891] 톱니바퀴 (자바) (2) | 2020.12.17 |
---|---|
[백준 16194] 카드 구매하기 2 (자바) (0) | 2020.12.17 |
[백준 2670] 연속부분최대곱 (자바) (0) | 2020.12.10 |
[백준 1149] RGB거리 (자바) (0) | 2020.12.10 |
[백준 14916] 거스름돈 (자바) (0) | 2020.12.10 |