출처: https://bumcrush.tistory.com/182 [맑음때때로 여름]
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 <cstring>
#include <algorithm>
using namespace std;
const int MAX = 100 + 1;
int coin[MAX];
int cache[10001];
int n, k;
void numofCoin()
{
cache[0] = 0;
for (int i = 1; i <= n; i++)
{
for (int j = coin[i]; j <= k; j++)
{
cache[j] = min(cache[j], cache[j - coin[i]] + 1);
}
}
if (cache[k] == 10000001)
cout << -1;
else
cout << cache[k];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> coin[i];
for (int i = 0; i <= k; i++)
cache[i] = 10000001;
numofCoin();
}
coin=[1, 3, 12] 라 가정하자. 그렇다면 기본적인 점화식은
dp[i] = min(dp[i-1], dp[i-3], dp[i-12]) + 1 이 된다. 이 점화식을 세우는 것 까지는 해냈는데 구현하다 막혀서 결국 구글에 검색해봤다. cache 배열에 미리 큰 값을 넣어놓고 저런 식의 이중 loop로 간단하게 구현하더라. 저런 모양의 이중 loop를 기억해둘 필요가 있을 것 같다.
이 문제를 풀면서 가장 크게 느꼈던 것은 다름 아닌 memset 함수였다. 제대로 알지도 못하고 이 함수를 쓰다보니 다 구현해 놓고도 계속 오류가 났다. memset 함수를 찾아서 공부해보니 내가 정말 막 쓰고 있었구나라는 생각에 조금은 한심했다..... 지금 memset 함수에 대해 정리를 하고 자야하지만 너무 졸리다. 내일 아침에 일어나서 정리해봐야 겠다.
백준 11722 가장 긴 감소하는 부분수열(dynamic programming) (0) | 2020.07.07 |
---|---|
백준 2133 타일 채우기(dynamic programming) (0) | 2020.07.07 |
백준 11048 이동하기(dynamic programming) (0) | 2020.07.05 |
백준 6603 로또(bfs) (0) | 2020.07.03 |
백준 2167 2차원 배열의 합(dynamic programming) (0) | 2020.07.03 |
댓글 영역