
https://www.acmicpc.net/problem/2294
가장 기본적인 DP문제입니다.
예전에는 아이디어가 전혀 떠오르지 않았는데 이제는 생각나는게 신기하네요
n가지 동전을 통해 k원을 만드는 문제입니다.
배낭문제와 비슷하지만 해당 동전 문제는 같은 동전을 중복해서 사용할 수 있다는 차이점이 있습니다.
평범한 배낭 문제에서는 중복을 피하기 위해 뒤에서 앞으로 탐색했지만 동전 문제는 중복이 가능하기 때문에 앞에서 뒤로 탐색하는 것이 더 간편한 방법입니다.
#include <algorithm>
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int N, K;
cin >> N >> K;
vector<int> coins(N, 0);
vector<int> dp(K+1, 10001);
for (int i = 0; i < N; ++i)
{
cin >> coins[i];
if (coins[i] <= K)
dp[coins[i]] = 1;
}
for (int i = 0; i <= K; ++i)
{
for (int j = 0; j < N; ++j)
{
int coin = coins[j];
if (i - coin >= 0)
{
dp[i] = min(dp[i], dp[i - coin] + 1);
}
}
}
if (dp[K] == 10001) cout << -1;
else cout << dp[K];
return 0;
}
동전의 가치는 1이상이고 k는 최대 1만이기 때문에 10001로 미리 초기화 해놓았습니다.
불가능 한 경우에 -1를 출력하는 것과 i-coin이 인덱스를 침범하지 않도록 예외만 처리하면 쉽게 해결할 수 있는 문제였네요
'Algorithm > PS' 카테고리의 다른 글
| [1일 1알고] G5 16494 가장 큰 값 (0) | 2026.04.09 |
|---|---|
| [1일 1알고] S3 3100 국기 인식 (0) | 2026.04.08 |
| [1일 1알고] G4 2110 공유기 설치 (0) | 2026.04.06 |
| [1일 1알고] G5 16500 문자열 판별 (0) | 2026.04.04 |
| [1일 1알고] S2 2232 지뢰 (0) | 2026.04.03 |