Cod sursa(job #3224519)

Utilizator dobreraduDobre Radu Fabian dobreradu Data 15 aprilie 2024 16:16:15
Problema Zebughil Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 18;
int v[NMAX];
int n, g;
struct Masca{
    int greutate, nr_camioane;
};
Masca dp[1<<NMAX];
Masca combine( Masca a, int b ){
    if( a.greutate + v[b] <= g )
        a.greutate += v[b];
    else{
        a.nr_camioane++;
        a.greutate = min(a.greutate, v[b]);
    }
    return a;
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    freopen("zebughil.in", "r", stdin);
    freopen("zebughil.out", "w", stdout);
    int t = 3;
    while( t-- ){
        cin >> n >> g;
        for( int i = 0; i < n; i++ )
            cin >> v[i];
        for( int mask = 1; mask < (1 << n); mask++ ){
            dp[mask].nr_camioane = n+1;
            for( int i = 0; i < n; i++ ){
                if( mask & ( 1 << i ) ){
                    int cpy = mask - ( 1 << i );
                    Masca x = combine(dp[cpy], i);
                    if( x.nr_camioane < dp[mask].nr_camioane || (x.nr_camioane == dp[mask].nr_camioane && x.greutate < dp[mask].greutate) )
                        dp[mask] = x;
                }
            }
        }
        cout << dp[(1 << n)-1].nr_camioane + 1 << endl;
    }
    return 0;
}