동전 2 성공
문제
n가지 종류의 동전이 있다. 이 동전들을 적당히 사용해서, 그 가치의 합이 k원이 되도록 하고 싶다. 그러면서 동전의 개수가 최소가 되도록 하려고 한다. 각각의 동전은 몇 개라도 사용할 수 있다.
사용한 동전의 구성이 같은데, 순서만 다른 것은 같은 경우이다.
입력
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어질 수도 있다.
출력
첫째 줄에 사용한 동전의 최소 개수를 출력한다. 불가능한 경우에는 -1을 출력한다.
예제 입력 1 복사
3 15 1 5 12
예제 출력 1 복사
3
https://www.acmicpc.net/problem/2294
2294번: 동전 2
첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어질 수도 있다.
www.acmicpc.net
내 소스
#include <iostream>
using namespace std;
int main(){
int n; // 동전 종류 수 (1 ≤ n ≤ 100)
int k; // 만드려는 가치의 합 (1 ≤ k ≤ 10,000)
// 동전의 가치는 100,000보다 작거나 같은 자연수이다. 가치가 같은 동전이 여러 번 주어질 수도 있다.
int *arr;
int *DP;
int i;
int j;
cin >> n;
cin >> k;
arr = new int[n];
DP = new int[k+1];
for(i=0; i<n; i++){
cin >> arr[i];
}
for(i=0; i<k+1; i++){
DP[i] = k+1;
}
for(i=0; i<n; i++){
for(j=1; j<=k; j++){
if(arr[i] == j){
DP[j] = 1;
}else if(arr[i] < j){
DP[j] = min(DP[j], DP[j - arr[i]]+1);
}
}
}
if(DP[k] == k+1){
cout << -1;
}else{
cout << DP[k];
}
return 0;
}
'Algorithm' 카테고리의 다른 글
[백준/배열] 4344 - 평균은 넘겠지 (0) | 2021.03.27 |
---|---|
[백준/DP] 9084 - 동전 (0) | 2020.02.01 |
[백준/DP] 14501 - 퇴사 (0) | 2020.01.26 |
[백준/DP] 1915 - 가장 큰 정사각형 (0) | 2020.01.21 |
[백준/DP] 1912 - 연속합 (0) | 2020.01.21 |