Cod sursa(job #50327)

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

#define Gdim 75001
#define Ndim 20001

int N;
int Nmin[2][Gdim];

long G, Gmax;

char A[Ndim];

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;
     
     for(j=0; j<=G; ++j)
              Nmin[1][j] = N+1;
     
     Nmin[1][A[1]] = 1;
     
     for(i=2; i<=N; ++i)
     {
              for(j=0; j<=G; ++j)
                       Nmin[i&1][j] = Nmin[(i-1)&1][j];

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

              for(j=A[i]+1; j<=G; ++j)
						  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);
}