알고리즘 문제
[백준] 2294번 동전 2
feelcoding
2020. 3. 12. 20:56
728x90
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>
#include <vector>
#include <iomanip>
#include <algorithm>
using namespace std;
int main() {
int n, k;
cin >> n >> k;
vector<int> coin(n);
for (int i = 0; i < n; i++) {
cin >> coin[i];
}
sort(coin.begin(), coin.end());
vector<vector<int>> dp(n, vector<int>(k + 1, 100001));
for (int i = 1; i <= k; i++) {
if (i % coin[0] == 0) {
dp[0][i] = i / coin[0];
}
}
for (int i = 1; i < n; i++) {
for (int j = 1; j <= k; j++) {
if (j < coin[i]) {
dp[i][j] = dp[i - 1][j];
}
else if (j == coin[i]) {
dp[i][j] = 1;
}
else {
dp[i][j] = min(dp[i - 1][j], dp[i][j - coin[i]] + 1);
}
}
}
/*cout << " ";
for (int i = 0; i <= k; i++) {
cout << setw(3) << i;
}
cout << endl;
for (int i = 0; i < n; i++) {
cout << setw(3) << coin[i];
for (int j = 0; j <= k; j++) {
if(dp[i][j] != 100001)
cout << setw(3) << dp[i][j];
else
cout << setw(3) << 0;
}
cout << endl;
}*/
if (dp[n - 1][k] != 100001) cout << dp[n - 1][k];
else cout << -1;
return 0;
}
728x90