BOJ::13902 개업 2

https://www.acmicpc.net/problem/13902


1. a벡터에 m개의 웍에 대한 정보 입력

2. m개의 웍들 중 2개의 조합으로 만들 수 있는 경우에 대해 a에 추가로 푸쉬

3. 만들어진 a벡터를 가지고 dp를 활용하여 d[n] 에 대한 최소값 찾아 출력 

ex) v = {1,3,5} : d[10] = min(d[10-1],d[10-3],d[10-5]) +1


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
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <vector>
using namespace std;
 
int main() {
    int n, m;
    scanf("%d %d"&n, &m);
    vector<int> a(m);
    vector<bool> check(n + 1false);
 
    // a벡터에 m개 입력 받는다
    while (m--) {
        scanf("%d"&a[m]);
        check[a[m]] = true;
    }
 
    // 조건에 벗어나지 않으면서, 
    // 두 웍의 합으로 만들 수 있는 모든 경우에 대해 저장
    int sz = a.size();
    for (int i = 0; i < sz - 1; i++) {
        for (int j = i + 1; j < sz; j++) {
            int v = a[i] + a[j];
            if (v > n || check[v]) continue;
            check[v] = true;
            a.push_back(v);
        }
    }
     
    // 짜장면 N그릇을 만드는 최소비용을
    // 다이나믹으로 찾는다.
    vector<int> d(n + 10);
    for (int i = 0; i < a.size(); i++) {
        d[a[i]] = 1;
        for (int j = a[i] + 1; j <= n; j++) {
            if (d[j - a[i]] == 0continue;
            if (d[j] == 0 || d[j] > d[j - a[i]] + 1
                d[j] = d[j - a[i]] + 1;
        }
    }
 
    if (d[n] == 0printf("-1\n");
    else printf("%d\n", d[n]);
}
cs


'BOJ::문제풀이' 카테고리의 다른 글

14501 퇴사  (0) 2018.01.07
14442 벽 부수고 이동하기 2  (0) 2018.01.07
13458 시험 감독  (0) 2018.01.07
13305 주유소  (4) 2018.01.07
12761 돌다리  (0) 2018.01.07

+ Recent posts