코딩공작소
[그리디]동전0 본문
그리디 라는 테마가 있기때문에 그리디 라는 생각을 먼저했었다.
총액에서 동전들을 전부 사용해가면서 구해봐야 하기 때문에 어차피 그리디로 돌려야 할것이라고 생각했을것 같다.
먼저 떠오른 생각은, 최소한의 동전을 사용해야하기 때문에 가장 큰 금액부터 사용해야된다는 것이었고,
사용할 수 있는 가장 큰 동전을 구해준 것이다. 그 후, 차차 아래의 동전들도 사용해가면서 개수를 구해주어야 겠다고
생각했다.(while문 부분이 키 포인트였다.)
문제
준규가 가지고 있는 동전은 총 N종류이고, 각각의 동전을 매우 많이 가지고 있다.
동전을 적절히 사용해서 그 가치의 합을 K로 만들려고 한다. 이때 필요한 동전 개수의 최솟값을 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000)
둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)
출력
첫째 줄에 K원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <iostream> using namespace std; int A[1000001]; int main() { int N, K, sum = 0; cin >> N >> K; int count; for (int i = 0; i < N; i++) { cin >> A[i]; if (A[i] < K) { count = i; } // <-- 가장 큰 금액의 동전을 찾는과정. } for (int j = count; j >= 0; j--) { //<-- 가장큰 동전부터 사용하기 위해서. while (K >= A[j]) { <-- KeyPoint. 동전을 사용해주면서 개수를 구해준다. K -= A[j]; sum++; } if (K == 0) break; //cout << "value : " << A[j] << " K : " << K << " sum : "<<sum<<endl; } cout << sum; return 0; } | cs |
'알고리즘 > 그리디&완탐' 카테고리의 다른 글
[백준]30_그리디?정수론? (0) | 2019.06.30 |
---|---|
[백준]로프 (0) | 2019.06.30 |
[백준]거스름돈 (0) | 2019.06.30 |
[백준]그리디_회의실배정 (0) | 2019.06.30 |
[완전탐색]백준_퇴사 (0) | 2019.04.06 |