Cod sursa(job #18325)

Utilizator Necromancercont dezactivat Necromancer Data 18 februarie 2007 11:30:52
Problema Ghiozdan Scor 50
Compilator cpp Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.58 kb
#include <stdio.h>
//#include <conio.h>

long int g[202], N, G, vmax, gmax, nmin;
long int ug[75202], nr[75202];

void citire ()
{
FILE *f;
long int i, x;
vmax=0;
//*g=new long[N+1];
f=fopen("ghiozdan.in", "r");
fscanf(f, "%ld", &N);
fscanf(f, "%ld", &G);
for (i=1; i<=N; i++)
	{
	fscanf(f, "%ld", &x);
	g[x]++;
	if (x>vmax)
		vmax=x;
	}
fclose(f);
//for (i=1; i<=vmax; i++)
//	if (g[i])
//		printf("%ld %ld\n", i, g[i]);
//getch();
}

void rezolvare ()
{
long i, j, k;
FILE *h;
//*nr=new long[G+202];
//*ug=new long[G+202];
for (i=1; i<=vmax; i++)
	if (g[i])
		{
		//printf("\nAm ales valoarea %ld", i);
		//getch();
		for (j=1; j<=G; j++)
			{
			if (nr[j] && ug[j]!=i)
				for (k=1; k<=g[i]; k++)
					if (j+k*i<=G)
						if (nr[j+k*i]==0 || nr[j+k*i]>nr[j]+k)
							{
							//printf("\n Modificare: nr[%ld]=%ld", j+k*i, nr[j]+k);
							//getch();
							nr[j+k*i]=nr[j]+k;
							ug[j+k*i]=i;
							}
			}
		for (j=1; j<=g[i]; j++)
			if (j*i<=G)
				if (nr[j*i]==0 || nr[j*i]>j)
					{
					//printf("\n Modificare: nr[%ld]=%ld", j*i, j);
					//getch();
					nr[j*i]=j;
					ug[j*i]=i;
					}
		}
//for (i=1; i<=G; i++)
//	printf("\nnr[%ld]=%d", i, nr[i]);
//getch();
//for (i=1; i<=G; i++)
//	printf("\nug[%ld]=%d", i, ug[i]);
//getch();
for (i=G; i>=1; i--)
	if (nr[i])
		{
		gmax=i;
		break;
		}
h=fopen("ghiozdan.out", "w");
fprintf(h, "%ld %ld\n", gmax, nr[gmax]);
i=gmax;
while (ug[i]!=0)
	{
	fprintf(h, "%ld\n", ug[i]);
	i=i-ug[i];
	}
fclose(h);
}

int main ()
{
citire();
rezolvare();
//getch();
return 0;
}