Cod sursa(job #3364136)

Utilizator adimiclaus15Miclaus Adrian Stefan adimiclaus15 Data 30 august 2026 13:23:07
Problema Zebughil Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.4 kb
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>
using namespace std;

//dp[mask] = {a, b}
//a = numarul minim de camioane pentru a transporta obiectele din mask
//b = capacitatea minima ocupata a unui camion

const int INF = 1e9;

struct lol {
    int nr_camioane;
    int gr_minim;
};

lol dp[(1 << 17)];
int v[17];


int main() {
    ifstream cin("zebughil.in");
    ofstream cout("zebughil.out");
    for(int t = 1; t <= 3; t++) {
        int n, g;
        cin >> n >> g;
        for(int i = 0; i < n; i++) {
            cin >> v[i];
        }
        for(int i = 0; i < (1 << n); i++) {
            dp[i] = {INF, INF};
        }
        for(int i = 0; i < n; i++) {
            dp[1 << i] = {1, v[i]};
        }
        for(int mask = 0; mask < (1 << n); mask++) {
            if(dp[mask].nr_camioane == INF) {
                for(int i = 0; i < n; i++) {
                    if(mask & (1 << i)) {
                        int pmask = mask - (1 << i);
                        if(dp[pmask].gr_minim + v[i] <= g) {
                            if(dp[pmask].nr_camioane < dp[mask].nr_camioane) {
                                dp[mask].nr_camioane = dp[pmask].nr_camioane;
                                dp[mask].gr_minim = dp[pmask].gr_minim + v[i];
                            } else {
                                if(dp[pmask].nr_camioane == dp[mask].nr_camioane) {
                                    if(dp[pmask].gr_minim + v[i] < dp[mask].gr_minim) {
                                        dp[mask].gr_minim = dp[pmask].gr_minim + v[i];
                                    }
                                }
                            }
                        } else {
                            if(dp[pmask].nr_camioane + 1 < dp[mask].nr_camioane) {
                                dp[mask].nr_camioane = dp[pmask].nr_camioane + 1;
                                dp[mask].gr_minim = dp[pmask].gr_minim + v[i];
                            } else {
                                if(dp[pmask].nr_camioane + 1 == dp[mask].nr_camioane) {
                                    if(v[i] < dp[mask].gr_minim) {
                                        dp[mask].gr_minim = v[i];
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        cout << dp[(1 << n) - 1].nr_camioane << '\n';
    }
}