본문 바로가기
PS/내가 보려고 쓰는 풀이

BOJ 1082

by dicohy27 2023. 1. 11.

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

 

1082번: 방 번호

스타트링크가 입주한 사무실은 방 번호를 직접 정할 수 있다. 방 번호를 정하려면 1층 문방구에서 파는 숫자를 구매해야 한다. 숫자를 구매하기 위해 준비한 금액은 M원이고, M원을 모두 사용해

www.acmicpc.net

그리디로 풀어보려다 포기하고 그냥 dp로 풀고 그리디 풀이를 봤다.

그리디 풀이:

1. 가장 값이 싼 숫자를 이어붙여 가장 자릿수가 긴 수를 만든다.

2. 앞 자릿수부터 바꿀 수 있는 가장 큰 숫자로 바꾼다.

 

dp코드

더보기
#include <bits/stdc++.h>
using namespace std;
#define all(v) (v).begin(), (v).end()
#define _unique(v) (v).erase(unique((v).begin(), (v).end()), (v).end())
#define pii pair<int, int>
#define pll pair<ll, ll>
#define tii tuple<int, int, int>
#define tll tuple<ll, ll, ll>
#define xx first
#define yy second
#define ll long long
const int INF = 1e9;
const ll mod = 998244353;

int n, m;
vector<int> arr;
string dp[55];

string dfs(int cur){
    string &ret = dp[cur];
    if(ret!="-1") return ret;
    ret = "";
    if(cur==m){
        for(int i=1;i<n;i++){
            if(cur>=arr[i]){
                string s = dfs(cur-arr[i]);
                if(ret.size()<s.size()+1){
                    ret = to_string(i)+s;
                }
                if(ret.size()==s.size()+1){
                    ret = max(ret, to_string(i)+s);
                }
            }
        }
    }
    else{
        for(int i=0;i<n;i++){
            if(cur>=arr[i]){
                string s = dfs(cur-arr[i]);
                if(ret.size()<s.size()+1){
                    ret = to_string(i)+s;
                }
                if(ret.size()==s.size()+1){
                    ret = max(ret, to_string(i)+s);
                }
            }
        }
    }
    return ret;
}

void solve() {
    cin>>n;
    arr.resize(n);
    for(auto &i:arr) cin>>i;
    cin>>m;
    for(int i=0;i<=m;i++){
        dp[i]="-1";
    }
    string ans = "";
    if(m>=arr[0]) ans = "0";
    cout<<max(ans, dfs(m));
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout << fixed;
    cout.precision(0);

#ifndef ONLINE_JUDGE
    freopen("./input.txt", "r", stdin);
    clock_t _st_t = clock();
#endif

    int tt = 1;
    //cin>>tt;
    while(tt--){
        solve();
        cout<<'\n';
    }

#ifndef ONLINE_JUDGE
    cerr << endl << endl << (double) (clock() - _st_t) / (double) CLOCKS_PER_SEC << "sec" << endl;
#endif

    return 0;
}

'PS > 내가 보려고 쓰는 풀이' 카테고리의 다른 글

BOJ 1222  (2) 2023.01.11
BOJ 3057  (0) 2023.01.11
BOJ 16319  (0) 2023.01.11
CF 1732D1  (0) 2022.11.04
CF 1732C1  (0) 2022.11.04