Cod sursa(job #397674)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 17 februarie 2010 12:21:15
Problema Zebughil Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include<stdio.h>
#include<string.h>
#define put (1<<18)+5
#define maxim(a,b) (a>b ? a : b)
int n,g,v[19];
short int d[put][19],viz[put][19];
int cond;
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);
        cond=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&v[i]);
            if(v[i])
                cond=1;
            d[(1<<(i-1))][1]=g-v[i];
            viz[(1<<(i-1))][1]=1;
        }
        lim=(1<<n)-1;
        for(i=1;i<=lim && cond;i++)
            for(j=1;j<=n;j++)
                if(viz[i][j])
                    for(k=1;k<=n;k++)
                    {
                        add=(1<<(k-1));
                        if(i&add)
                            continue;
                        if(d[i][j]-v[k]>=0)
                        {
                            if(!viz[i+add][j])
                                d[i+add][j]=d[i][j]-v[k];
                            else
                                d[i+add][j]=maxim(d[i+add][j],d[i][j]-v[k]);
                            viz[i+add][j]=1;
                         }  //if
                        else
                        {
                            if(!viz[i+add][j+1])
                                d[i+add][j+1]=g-v[k];
                            else
                                d[i+add][j+1]=maxim(d[i+add][j+1],g-v[k]);
                            viz[i+add][j+1]=1;
                        }
                            
                    }
                    
        for(i=1;i<=n;i++)
            if(viz[lim][i])
                break;
        if(cond)
            printf("%d\n",i);
        else
            printf("0\n");
        memset(viz,0,sizeof(viz));
        memset(d,0,sizeof(d));
    }
    return 0;
}