728x90
해결방법
알고리즘은 그리디를 사용하였다. 하지만 그리디를 사용해도 최적인지 증명과정이 필요하다.
증명
문제에서는 i개의 동전이 있고, 오름차순으로 주어진다. N을 금액이라고 할 때 동전이 N보다 작다면 항상 아래와 같다.
$$ N / C_{i} <= N / C_{i-1} $$
N에 동전금액 만큼 제거 값을 N2라고 하자. 동전이 N2보다 작다면 똑같은 결과가 나온다.
$$ N2 / C_{i} <= N2 / C_{i-1} $$
따라서 항상 제일 큰 코인으로 세는 것이 가장 작다.
전체코드
#include<iostream>
using namespace std;
int c[10], K, N;
int main() {
cin >> K >> N;
int ans = 0;
for (int i = 0; i < K; ++i)
cin >> c[i];
for (int i = K - 1; i >= 0; --i)
if (N >= c[i]) {
ans += N / c[i];
N -= (N / c[i] * c[i]);
}
cout << ans << endl;
return 0;
}
728x90
'Algorithm > BOJ' 카테고리의 다른 글
1931번 - 회의실 배정 (0) | 2019.05.05 |
---|---|
6549번 - 히스토그램에서 가장 큰 직사각형 (0) | 2019.05.02 |
동물원 - 1309번 (0) | 2019.04.29 |
3980번 - 선발명단 (0) | 2019.04.20 |
1102번 - 발전소 (0) | 2019.04.19 |
댓글