본문 바로가기

UCPC

[20/07/05] G. 개업 2 (13902)

 

디피~~~ 너무너무ㅠㅠㅠㅠㅠ 어렵다ㅠㅠㅠㅠ

 

이틀 걸려서 겨우겨우 풀었음

 

개념 잘 몰라서 ppt로 개념 서너번 읽고 블로그 글 읽고 거기 있는 백준 예제 풀어보고 그랬음ㅠ

 

물론 처음 접했을 때 어려운 건 알지만 그래도 ㅠ.ㅠ.ㅠ.ㅠ

 

 

 

이거 bottom up으로 하고 싶은데 어떻게 할지 몰라서 작년에 알고리즘 수업시간에 배운 거 사용해서 풀었다.

 

 

그리디 챕터 때 배운 건데 이 문제랑 비슷한 것 같음. 

 

코드는 되는대로 짰는데 잘 짰는지는 모르겠다. 디피 이렇게 하는 게 맞나? (memoization 쓰면 그게 다 디피겠지만)

 

엉엉헝헝 디피랑은 좀 더 친해져야겠다. 

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <map>
#define xx first
#define yy second
 
using namespace std;
using i64 = long long;
using ii = pair<int, int>;
using ii64 = pair<i64, i64>;

bool desc(int a, int b){ return a > b; };

int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    
    vector<int> v(m);
    for (int i = 0; i < m; i++)
        scanf("%d", &v[i]);
    
    for (int i = 0; i < m-1; i++)
    {
        for (int j = i+1; j < m; j++)
        {
            if (v[i]+v[j] <= n)
                v.push_back(v[i]+v[j]);
        }
    }
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    
    vector<int> d(n+1, 10005);
    d[0] = 0;
    for (int i = 1; i <= n; i++)
    {
        set<int> s;
        for (int j = 0; j < v.size(); j++)
        {
            if (i - v[j] >= 0)
                s.insert(d[i - v[j]] + 1);
            else
                s.insert(10005);
        }
        d[i] = *s.begin();
    }

    if (d[n] >= 10005)
    {
        printf("-1");
        return 0;
    }
    printf("%d", d[n]);
    return 0;
}

'UCPC' 카테고리의 다른 글

UCPC 2020 후기  (0) 2020.08.01
[20/07/12] ucpc 연습문제  (0) 2020.07.20
[20/07/05] I. 수학 숙제 (2870)  (0) 2020.07.09
[20/07/05] H. 표절 (2428)  (0) 2020.07.09
[20/07/05] J. 비밀이메일 (2999)  (0) 2020.07.09