반응형
12-13 01:00
- Today
- Total
Link
개발하는 고라니
[백준] 2294번 : 동전 2 본문
반응형
# 문제
n가지 종류의 동전이 있다. 이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그러면서 동전의 개수가 최소가 되도록 하려고 한다. 각각의 동전은 몇 개라도 사용할 수 있다.
사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다.
# 입력
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어질 수도 있다.
# 출력
첫째 줄에 사용한 동전의 최소 개수를 출력한다. 불가능한 경우에는 -1을 출력한다.
# 예제 입력
3 15
1
5
12
# 예제 출력
3
[메모제이션(동적 프로그래밍)]
백준의 동전 시리즈 문제이다. 동전 1은 n개의 각 동전으로 k원을 만들 수 있는 경우의 수를 구하는 문제였다면, 동전 2는 n개의 각 동전으로 k원을 만들 때 그 개수의 최소값을 찾는 문제이다.
dp[]에 i원을 만들 때 사용되는 동전의 최소값을 저장한다. 이 때 k는 10000 이하이지만, 범위에 주의해야한다. 동전의 최대값은 100,000이기 때문이다. 그리고 dp[]는 INF로 초기화한다.
dp[j]에 값을 저장하기 전에 tmp라는 임시 변수에 dp[ j - coin[i] ] + 1를 저장하고, dp[j]와 비교했을 때 tmp가 더 작은 값이면 그 때 dp[j]에 값을 넣도록 하자.
# Code </>
public class Main {
static final int INF = 1000000000;
static int[] dp = new int[100001], coin = new int[101];
static int n, k;
static void Dynamic(){
for(int i=1; i<=n; i++){
dp[ coin[i] ] = 1;
for(int j=coin[i]; j<=k; j++){
int tmp = dp[j - coin[i]] + 1;
dp[j] = tmp < dp[j]? tmp : dp[j];
}
}
System.out.println(dp[k] == INF? -1:dp[k]);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
for(int i=1; i<=n; i++)
coin[i] = Integer.parseInt(br.readLine());
Arrays.fill(dp, INF);
Dynamic();
}
}
반응형
'Programming > 백준' 카테고리의 다른 글
[백준] 1162번 : 도로 포장 (0) | 2021.02.08 |
---|---|
[백준] 1010번 : 다리 놓기 (0) | 2021.02.06 |
[백준] 3197번 : 백조의 호수 (0) | 2021.02.05 |
[백준] 9466번 : 텀 프로젝트 (0) | 2021.02.05 |
[백준] 18352번 : 특정 거리의 도시 찾기 (0) | 2021.02.04 |
Comments