Cod sursa(job #2239664)

Utilizator LucaSeriSeritan Luca LucaSeri Data 11 septembrie 2018 16:45:39
Problema Ghiozdan Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 1.73 kb
#include <bits/stdc++.h>
using namespace std;

typedef pair< int, int > pii;
typedef pair< long long, long long > pll;
typedef long long ll;
typedef vector< int > vi;
typedef vector< ll > vll;
typedef vector< pii > vpii;
typedef long double ld;

ll lgput(ll a, ll b, ll mod) {
    ll ret = 1;
    while( b ){
        if(b & 1) ret = (ret * a) % mod;
        a = (a * a) % mod;
        b >>= 1;
    }

    return ret;
}

int binarySearch(vector< int > &v, int value) {
    int best = 0;
    for(int step = 29; step >= 0; --step) {
        if(best + (1<<step) < v.size() && v[best + (1<<step)] <= value) best += (1<<step);
    }

    return best;
}

const int MAXG = 75010;
const int inf = 0x3f3f3f3f;

int fv[210];
int dp[MAXG];
int last[MAXG];

int main() {
    ios::sync_with_stdio(false);

    ifstream f("ghiozdan.in");
    ofstream h("ghiozdan.out");

    int n;
    f >> n;
    int g;
    f >> g;

    memset(dp, 0x3f, sizeof dp);
    for(int i = 1; i <= n; ++i) {
        int x;
        f >> x;
        fv[x] ++;
    }

    dp[0] = 0;
    for(int i = 200; i > 0; --i) {
        if(!fv[i]) continue;
        for(int j = g; j >= 0; --j) {
            if(dp[j] == inf) continue;
            for(int k = 1; k <= fv[i]; ++k) {
                int nxt = j + k*i;
                if(nxt > g || dp[nxt] != inf) break;
                dp[nxt] = dp[j] + k;
                last[nxt] = i;
            }
        }
    }

    for(int i = g; i >= 0; --i) {
        if(dp[i] != inf) {
            h << i << ' ' << dp[i] << '\n';
            while(last[i]) {
                h << last[i] << '\n';
                i -= last[i];
            }

            return 0;
        }
    }

    return 0;
}