Cod sursa(job #3174517)

Utilizator victor_gabrielVictor Tene victor_gabriel Data 24 noiembrie 2023 20:55:52
Problema Zebughil Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>

using namespace std;

ifstream fin("zebughil.in");
ofstream fout("zebughil.out");

const int DIM = 140000;

struct punct {
    int nr, g;
} dp[DIM];

int v[18];
int n, gMax, st, ant, bit;

int main() {
    dp[0].nr = 1, dp[0].g = 0;
    for (int t = 1; t <= 3; t++) {
        fin >> n >> gMax;
        for (int i = 1; i <= n; i++)
            fin >> v[i];

        for (int i = 1; i < (1 << n); i++) {
            dp[i].nr = n + 1;
            dp[i].g = 0;
        }

        for (st = 1; st < (1 << n); st++) {
            for (bit = 0; bit < n; bit++) {
                if (((st >> bit) & 1) == 1) {
                    ant = st - (1 << bit);
                    if (dp[ant].nr != n + 1) {
                        if (dp[ant].g + 1LL * v[bit + 1] <= gMax) {
                            if (dp[st].nr > dp[ant].nr || dp[st].nr == dp[ant].nr && dp[st].g > dp[ant].g + v[bit + 1]) {
                                dp[st].nr = dp[ant].nr;
                                dp[st].g = dp[ant].g + v[bit + 1];
                            }
                        } else {
                            if (dp[st].nr > dp[ant].nr + 1 || dp[st].nr == dp[ant].nr + 1 && dp[st].g > v[bit + 1]) {
                                dp[st].nr = dp[ant].nr + 1;
                                dp[st].g = v[bit + 1];
                            }
                        }
                    }
                }
            }
        }

        fout << dp[(1 << n) - 1].nr << '\n';
    }

    return 0;
}