치춘짱베리굿나이스
[백준] 2294 본문
동전 2
문제
n가지 종류의 동전이 있다. 이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그러면서 동전의 개수가 최소가 되도록 하려고 한다. 각각의 동전은 몇 개라도 사용할 수 있다.
사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다.
입력
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어질 수도 있다.
출력
첫째 줄에 사용한 동전의 최소 개수를 출력한다. 불가능한 경우에는 -1을 출력한다.
풀이
#include <iostream>
#include <algorithm>
int dp[10001];
int v[101];
int main(void) {
int n, k, min;
std::cin >> n >> k;
for (int i = 0; i < n; i++) {
std::cin >> v[i];
}
for (int i = 1; i <= k; i++) {
min = 20000;
for (int j = 0; j < n; j++) {
if (i == v[j]) {
min = 1;
break;
}
if (i < v[j]) continue;
min = std::min(dp[i - v[j]] + 1, min);
}
dp[i] = min;
}
if (dp[k] == 20000) std::cout << -1;
else std::cout << dp[k];
}
반성회
dp[i - v[j]]
의 최소값에 에 동전 하나만 더하면 dp[i]
의 최소값이 되므로 반복문을 통해 dp[i - v[j]]
의 최소값을 구해준다
만약 동전과 금액이 같을 경우 (i == v[j]
) 동전 한 개만으로 금액을 처리할 수 있으므로 1로 초기화한다
'C C++ > 알고리즘풀이' 카테고리의 다른 글
[백준] 18352 (0) | 2023.08.30 |
---|---|
[백준] 2225 (0) | 2023.08.27 |
[백준] 2293 (0) | 2023.08.26 |
[백준] 1327 (0) | 2023.08.24 |
[백준] 14916 (0) | 2023.08.24 |
Comments