728x90
728x90
https://www.acmicpc.net/problem/11047
문제
준규가 가지고 있는 동전은 총 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원을 만드는데 필요한 동전 개수의 최솟값을 출력한다.
풀이
i ≥ 2인 경우에 Ai는 Ai-1의 배수 라는 조건 때문에 그리디로 접근하면 된다는 것을 알게 되었다. 그리디는 매 순간마다 최선의 선택을 하게 되므로 k를 넘지 않는 선에서 가장 높은 금액으로 고르게 했다.
처음에 out of bound 에러가 나서 확인해본 결과 k보다 작거나 같은 동전만 있는 경우를 고려하지 않는 것을 발견해서 해결했다.
ex)
3 501
1
250
500
동전이 0원이 될 때까지 구하고 동전개수 값을 return
#include <bits/stdc++.h>
using namespace std;
int main() {
int num, k; //num : 동전의 종류, k : 합
cin >> num >> k;
vector <int> v;
for (int i = 0; i < num; i++) {
int tmp;
cin >> tmp;
v.push_back(tmp);
}
int cnt = 0;
while(true) {
if (k == 0) { //종료조건
cout << cnt << endl;
return 0;
}
int tmp = 0;
for (int j = 0;; j++) {
if (v[j] > k ) {
tmp = v[j - 1];
break;
}
else if (j == v.size() - 1) { // k보다 작거나 같은 동전만 있는 경우
tmp = v[j];
break;
}
}
cnt += k / tmp; //동전개수
k -= tmp *( k / tmp); // 합에서 동전개수*동전의가치 빼줌
}
}
728x90
728x90
'Algorihtm > BOJ' 카테고리의 다른 글
C++ 백준 11062번 : 카드 게임 (0) | 2023.01.12 |
---|---|
C++ 백준 11399번: ATM (0) | 2023.01.11 |
C++ 백준 7795번: 먹을 것인가 먹힐 것인가 (0) | 2023.01.10 |
C++ 백준 14425번: 문자열 집합 (1) | 2023.01.10 |
C++ 백준 11656번: 접미사 배열 (0) | 2023.01.09 |