Cod sursa(job #396916)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 16 februarie 2010 08:31:46
Problema Zebughil Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include<stdio.h>
#include<string.h>
#define put (1<<17)+10
#define maxim(a,b) (a>b ? a : b)
int n,g,v[21];
char d[put][18],viz[put][18];

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]);
            d[(1<<(i-1))][1]=g-v[i];
            viz[(1<<(i-1))][1]=1;
        }
        lim=(1<<n)-1;
        for(i=1;i<=lim;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;
        printf("%d\n",i);
        memset(viz,0,sizeof(viz));
        memset(d,0,sizeof(d));
    }
    return 0;
}