Pagini recente » Cod sursa (job #2503609) | Cod sursa (job #1198) | Cod sursa (job #3286520) | Monitorul de evaluare | Cod sursa (job #18325)
Cod sursa(job #18325)
#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;
}