Cod sursa(job #3289554)

Utilizator Andercau_VasileAndercau Vasile Andercau_Vasile Data 27 martie 2025 13:31:05
Problema Zebughil Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <fstream>
using namespace std;

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

#define NMAX 20
#define INF 1000000000

int z[NMAX];
int dp[(1 << NMAX)][NMAX];
// luand blocurile pentru care biti sunt 1 in i, folosind j camioane
//si in dp[i][j] retin cat spatiu mai este in ultimul camion

int main() {
    int t = 3;
    while (t--) {
        int n, g;
        fin >> n >> g;
        for (int i = 1; i <= n; ++i) {
            fin >> z[i];
        }

        for (int i = 0; i < (1 << n); ++i) {
            for (int j = 1; j <= n; ++j) {
                dp[i][j] = INF;
            }
        }

        dp[0][1] = g;
        for (int i = 0; i < (1 << n); ++i) {
            for (int j = 1; j <= n; ++j) {
                if (dp[i][j] != INF) {
                    for (int k = 0; k < n; ++k) {
                        if ((i & (1 << k)) == 0) {
                            int conf = i + (1 << k);
                            if (z[k] <= dp[i][j]) {
                                dp[conf][j] = min(dp[conf][j], dp[i][j] - z[k]);
                            } else {
                                dp[conf][j + 1] = min(dp[conf][j + 1], g - z[k]);
                            }
                        }
                    }
                }
            }
        }

        int minim = n;
        for (int i = 1; i <= n; ++i) {
            if (dp[(1 << n) - 1][i] != INF) {
                minim = min(minim, i);
            }
        }

        fout << minim << '\n';
    }
    return 0;
}