Cod sursa(job #411232)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 4 martie 2010 19:31:19
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<stdio.h>
#include<string.h>
#define put (1<<18)+10
#define maxim(a,b) (a>b ? a : b)
int n,g,v[21];
int d[put][21];
int main ()
{
    int con,i,j,k,lim,add;
    freopen("zebughil.in","r",stdin);
    freopen("zebughil.out","w",stdout);
    con=3;
    for(;con;con--)
    {
        scanf("%d%d",&n,&g);
        for(i=1;i<=n;i++)
            scanf("%d",&v[i]);

        lim=(1<<n)-1;

        memset(d, -1, sizeof(d));
        d[0][0] = 0;
            
        for(i=1;i<=lim;i++)
        {
            for(k = 1; k <= n; k++)
                if ((1<<(k-1)) == i)
                {
                    d[i][1] = g-v[k];
                    break;
                }
            if (k <= n)
                continue;
                
            for(j=1;j<=n;j++)
            {
                for(k=1;k<=n;k++)
                {
                    add=(1<<(k-1));
                    if(!(i&add))
                        continue;

                    // obiectul k il includ intr-un nou trans
                    if (d[i-add][j-1] != -1)
                        d[i][j] = maxim(d[i][j], g-v[k]);

                    // obiectul k il includ in ultimul trans
                    if (d[i-add][j] >= v[k])
                        d[i][j] = maxim(d[i][j], d[i-add][j]-v[k]);
                }
            }
        }

        for(i=1;i<=n;i++)
            if(d[lim][i] != -1)
                break;

        printf("%d\n", i);
    }
    return 0;
}