Cod sursa(job #964665)

Utilizator narcis_vsGemene Narcis - Gabriel narcis_vs Data 21 iunie 2013 22:33:22
Problema Zebughil Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
///folosim dinamica "inainte"
#include <fstream>
#include <cstring>

#define In "zegubil.in"
#define Out "zegubil.out"

using namespace std;

ifstream f(In);
ofstream g(Out);

int N, G;
int dp[1<<17], cap[1<<17],A[17];
///dp[i] = numarul minim de ca camioane cu care trebuie
///transportate obiectele cu indicii bitilor de 1 din reprezentarea binara a lui i
///cap[i] = capacitatea ramasa in ultimul camion caracteristica configuratiei i
inline void Read()
{
    f>>N>>G;
    for(int i = 0 ;i < N; ++i)
        f>>A[i];
}

inline void Solve()
{
    int conf, nr, r,i, _max = (1<<N), Next;
    for(conf = 1;conf< _max; ++conf)
        dp[conf] = N+1;
    dp[0] = 0;
    for(conf = 0;conf< _max; ++conf)
        for(i = 0;i < N ; ++i)
            if(((conf&(1<<i))==0))
            {
                if(cap[conf] >= A[i])
                {
                    nr = dp[conf];
                    r = cap[conf]-A[i];
                }
                else
                {
                    nr = dp[conf]+1;
                    r = G - A[i];
                }

                Next = conf+(1<<i);
                if(dp[Next]>nr)
                {
                    dp[Next] = nr;
                    cap[Next] = r;
                }
                else
                    if(dp[Next] == nr && cap[Next]<r)
                        cap[Next] = r;
            }
    g<<dp[_max-1]<<"\n";
}

int main()
{
    for(int T = 3 ;T ;T--)
    {
        Read();
        Solve();
    }
    g.close();
    return 0;
}