Cod sursa(job #50429)

Utilizator raula_sanChis Raoul raula_san Data 7 aprilie 2007 18:12:33
Problema Ghiozdan Scor 74
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <cstdio>

#define Gdim 75001
#define Vdim 201

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

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(j=0; j<=G; ++j) Nmin[Min&1][j] = N + 1;
	 for(j=1; j<=C[Min]; ++j)
	 {
		Nmin[Min&1][j*Min] = j;
		R[j*Min] = (j-1) * Min;
	 }

	 for(i=Min+1; i<=Max; ++i)
	 {
				  for(j=0; j<=G; ++j)
				  {
						   if(j/i <= C[i] && !(j % i)) Nmin[i&1][j] = j / i;
						   else Nmin[i&1][j] = Nmin[(i-1)&1][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;
																	R[j] = j - i;
										  }
	 }
     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]);
     
     while(Gmax)
	 {
		printf("%d\n", Gmax-R[Gmax]);
		Gmax = R[Gmax];
	 }
     
     fclose(stdout);
}