Cod sursa(job #787258)

Utilizator vendettaSalajan Razvan vendetta Data 12 septembrie 2012 23:33:51
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.4 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>

using namespace std;

ifstream f("zebughil.in");
ofstream g("zebughil.out");

#define nmax 18
#define Exp ((1<<17)+1)
#define inf (1<<29)

int n, G, a[nmax], dp[Exp][nmax];

void citeste(){

    f >> n >> G;//numarul de greutati si Greutatea maxima ce poate sa o transporte un camion
    for(int i=1; i<=n; ++i) f >> a[i];

}

void reset(){

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

}

void rezolva(){

    //trebuie sa aflu numarul minim de camioane a. i. sa transport toate greutatile
    //dp[conf][j] = X = cantitea pusa in ultmul camion folosind greutatile corespunzatoare bitilor de 1 din conf si avand j camioane


    int T = 3;
    for(; T; --T){
        citeste();
        reset();

        //initialiez dinamica
        for(int i=0; i<n; ++i) dp[(1<<i)][1] = a[i+1];//cantitaea din ultimul camion folosind greautatea i(initial am doar un camion; trebuie sa incep de la ceva)

        for(int conf=0; conf<(1<<n); ++conf){
            for(int j=1; j<=n; ++j){//am j camioane
                if (dp[conf][j] == inf) continue;//daca nu am reusit sa ajung in starea asta
                for(int i=0; i<n; ++i){//pentru fiecare bit de 0 il fac 1
                    if ( (conf & (1<<i) ) == 0 ){
                        int new_conf = conf | (1<<i);
                        //intr-o stare (conf,j) vreau sa am acea greutate cat mai mica pentru a permite cat mai multe greutati
                        //=> cand ma duc intr-o noua stare sa iau minimnul
                        if (dp[conf][j] + a[i+1] > G){//daca noua greutate nu o pot duce cu al j-lea camioan atunci mai bag inca unul
                            dp[new_conf][j+1] = a[i+1];//aici nu are rost pentru ca inseama ca iau a i+1-a greautate singura si greutatea minima posibila e chiar ea(a[i+1])
                        }else {
                            dp[new_conf][j] = min(dp[new_conf][j], dp[conf][j] + a[i+1]);
                        }
                    }
                }
            }
        }
        for(int j=1; j<=n; ++j){
            if (dp[(1<<n)-1][j] != inf){
                g << j << "\n";
                break;
            }
        }

    }

}

int main(){


    rezolva();

    f.close();
    g.close();

    return 0;

}