#include <iostream>
#include <vector>
#include <queue>
int dp[10001] = {};
int main()
{
int n = 0;
int k = 0;
std::cin >> n >> k;
int iMax = k;
for (int i = 0; i <= 10000; ++i)
{
dp[i] = 10001;
}
std::vector<int> vec(n,0);
for (int i = 0; i < n; ++i)
{
std::cin >> vec[i];
if (vec[i] <= 10001)
dp[vec[i]] = 1;
}
for (int i = 0; i <= k; ++i)
{
if (dp[i] != 10001)
{
for (int j = 0; j < vec.size(); ++j)
{
if (vec[j] <= 10001)
{
if (i + vec[j] <= 10000 && i + vec[j] <= k)
{
if (dp[i + vec[j]] > dp[i] + 1)
dp[i + vec[j]] = dp[i] + 1;
}
}
}
}
}
if (dp[k] == 10001)
std::cout << -1;
else
std::cout << dp[k];
return 0;
}
이전 동전 문제랑 비슷하게 풀었다.
1. 받은 숫자들에다가 갯수 1 (최대 수인 10001이 넘어가면 패스)
2. 할 수 없는 숫자면 넘어가고 할 수 있다면 vec에 있는 만큼 돌려서 추가 숫자로 입력
'오늘의 알고리즘' 카테고리의 다른 글
[C++] 백준 1260 DFS와 BFS (0) | 2022.05.06 |
---|---|
[C++] 백준 2133 타일 채우기 (0) | 2022.05.05 |
[C++] 백준 9461번 파도반 수열 (0) | 2022.05.04 |
[C++] 백준 2239 동전1 (0) | 2022.05.03 |
[C++] 백준 9465번 스티커 (0) | 2022.05.03 |