다이나믹 프로그래밍을 사용하는 문제 d를 0부터 끝까지 순회하므로 만약 d[i]번째에 도달하는 경로가 없을 경우 이를 계산하지 않도록 유의하면서 if문을 짜줘야한다. j원에서 동전 값을 뺀 것이 0보다 크고 동시에 d[j - coin[i]] 또한 -1 (배열을 -1로 값을 설정했다.)이 아니어야 이전에 값이 메모라이징 됬었다는 것이고 처음 j원에 방문하는 것인지 아닌지를 판단해 준 후 가장 최소 값을 입력해준다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | #include <iostream> #include <algorithm> using namespace std; int n, k; int coin[106]; int d[10006]; int main() { cin >> n >> k; for (int i = 0; i < n; ++i) cin >> coin[i]; for (int i = 0; i < 10006; ++i) d[i] = -1; d[0] = 0; for (int i = 0; i < n; ++i) for (int j = 1; j <= k; ++j) { if (j - coin[i] >= 0 && d[j - coin[i]] != -1){ if (d[j] == -1) d[j] = d[j - coin[i]] + 1; else d[j] = min(d[j], d[j - coin[i]] + 1); } } cout << d[k] << '\n'; return 0; } | cs |
'백준 온라인 저지' 카테고리의 다른 글
백준 5557: 1학년 (0) | 2018.08.04 |
---|---|
백준 1495: 기타리스트 (0) | 2018.08.04 |
백준 2293: 동전 1 (0) | 2018.08.04 |
백준 10942: 팰린드롬? (0) | 2018.07.31 |
백준 1890: 점프 (0) | 2018.07.31 |