Cod sursa(job #50376)

Utilizator raula_sanChis Raoul raula_san Data 7 aprilie 2007 16:41:48
Problema Ghiozdan Scor 36
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <cstdio>

#define Gdim 75001
#define Vdim 201

int N, Max, Min	= Vdim;
int Nmin[2][Gdim], C[Vdim];

long G, Gmax;

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);
                   ++ C[value];
                   
                   Min = value < Min ? value : Min;
                   Max = value > Max ? value : Max;
     }
     
     fclose(stdin);
}

void dynamics()
{
     int i; long j, k;
     
     for(i=1; i<=G; ++i) Nmin[Min&1][i] = N + 1;
     for(i=1; i<=C[Min]; ++i) Nmin[Min&1][i*Min] = i;
     
     for(i=Min+1; i<=Max; ++i)
     {
                  for(j=1; j<=G; ++j) Nmin[i&1][j] = Nmin[(i-1)&1][j];
                  for(j=1; j<=C[i]; ++j)
                           if(j < Nmin[i&1][i*j]) Nmin[i&1][i*j] = j;
                  for(k=1; k<=C[i]; ++k)
                           for(j=(i*k)+1; j<=G; ++j)
                                          if(Nmin[(i-1)&1][j-(i*k)] + k < Nmin[i&1][j])
                                                                    Nmin[i&1][j] = Nmin[(i-1)&1][j-(i*k)] + k;
     }
     for(j=G; j; --j)
			  if(Nmin[Max&1][j] != N + 1)
              {
                         Gmax = j;
                         break;
              }
}

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