Cod sursa(job #50319)

Utilizator raula_sanChis Raoul raula_san Data 7 aprilie 2007 14:31:03
Problema Ghiozdan Scor 6
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <cstdio>
#include <cstring>

#define dim 75001

int N;
int Nmin[2][dim];

long G, Gmax;

char A[dim];

void get_data();
void dynamics();
void print();

int main()
{
    get_data();
    dynamics();
    print();
    
    return 0;
}

void get_data()
{
	 freopen("ghiozdan.in", "r", stdin);
     
     int i, value;
     for(scanf("%d %ld", &N, &G), i=1; i<=N; ++i)
     {
                   scanf("%d", &value);
                   A[i] = value;
     }
     
     fclose(stdin);
}

void dynamics()
{
     int i; long j;
     
     Nmin[1][A[1]] = 1;
     for(i=2; i<=N; ++i)
     {
			  memset(Nmin[i&1], 0, (G+1)*sizeof(int));
			  memcpy(Nmin[i&1], Nmin[(i-1)&1], A[i]*sizeof(int));

			  Nmin[i&1][A[i]] = 1;

              for(j=A[i]+1; j<=G; ++j)
              {
						  Nmin[i&1][j] = Nmin[(i-1)&1][j] ? Nmin[(i-1)&1][j] : N+1;

						  if(Nmin[(i-1)&1][j-A[i]] && Nmin[(i-1)&1][j-A[i]] + 1  < Nmin[i&1][j])
												   Nmin[i&1][j] = Nmin[(i-1)&1][j-A[i]] + 1;
			  }
	 }

	 for(j=G; j; --j)
			  if(Nmin[N&1][j] != N+1)
              {
                              Gmax = j;
                              break;
              }
}

void print()
{
     freopen("ghiozdan.out", "w", stdout);
     
     printf("%ld %d\n", Gmax, Nmin[N&1][Gmax]);
     
     fclose(stdout);
}