Cod sursa(job #70268)

Utilizator moga_florianFlorian MOGA moga_florian Data 5 iulie 2007 13:26:20
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<stdio.h>
#define Nmax 17
#define inf 2000000003

int A[Nmax],cam[(1<<Nmax)+5],liber[(1<<Nmax)+5];

int main()
{
FILE *fin=fopen("zebughil.in","r"),
     *fout=fopen("zebughil.out","w");
     
int N,G,T=3,maxim,confnou,conf,i;

while(T--)
  {
  fscanf(fin,"%d%d",&N,&G);
  maxim=-1;
  for(i=0;i<N;i++)
    {
    fscanf(fin,"%d",&A[i]);        
    if(A[i]>maxim) maxim=A[i];
    }
    
  if(maxim>G) fprintf(fout,"0\n");
  else
  {    
  cam[0]=liber[0]=0;
  for(conf=1;conf< (1<<N); conf++)
     {
     cam[conf]=inf;
     liber[conf]=0;
     
     for(i=0;i<N;i++)
       if( (conf & (1<<i)) )
          {
          confnou=conf-(1<<i);
          if(liber[confnou] >= A[i])
             {
             if(cam[confnou] < cam[conf] || 
               (cam[confnou] == cam[conf] && liber[conf]<liber[confnou]-A[i]) )
                  {
                  cam[conf]=cam[confnou];
                  liber[conf]=liber[confnou]-A[i];                
                  }               
             }
          else
          if(cam[confnou]+1 < cam[conf] || 
            (cam[confnou]+1 == cam[conf] && liber[conf]<G-A[i]) )
               {
               liber[conf]=G-A[i];
               cam[conf]=cam[confnou]+1;
               }
          }
     }
     
  fprintf(fout,"%d\n",cam[conf-1]);
  }       
  }
    
fclose(fin);
fclose(fout);
return 0;    
}