Cod sursa(job #216319)

Utilizator VmanDuta Vlad Vman Data 23 octombrie 2008 21:46:37
Problema Zebughil Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <cstdio>
#include <cstring>
#define Nmax 18

int N,G,t,i;
int Z[Nmax];
int A[1<<Nmax], B[1<<Nmax];

void solve()
{
 int full=(1<<N),j,p;
 B[0] = G;
 A[0] = 1;
 for (i=1; i<full; ++i)
     {
      A[i]=N+1;
      B[i]=0;
      for (j=1,p=1; j<=N && p<=i; ++j,p<<=1)
         {
          if ( (i&p) == 0 ) continue;
          if (B[i-p] - Z[j] >= 0)
             if ( A[i-p]<A[i] || (A[i-p]==A[i] && B[i-p]-Z[j]>B[i]) )
                {
                 A[i] = A[i-p];
                 B[i] = B[i-p] - Z[j];
                }
             else;
          else if (A[i-p] + 1 < A[i] || (A[i-p]+1==A[i] && G-Z[j]>B[i]) )
               {
                A[i] = A[i-p] + 1;
                B[i] = G - Z[j];
               }
         }
     }
 printf("%d\n",A[full-1]);
}

int main()
{
 freopen("zebughil.in","r",stdin);
 freopen("zebughil.out","w",stdout); 
 for (t=0;t<3;++t)
     {
      scanf("%d %d",&N,&G);
      for (i=1; i<=N; ++i)
          scanf("%d",&Z[i]);
      solve();
     }
 fclose(stdout); 
 return 0;
}