Pagini recente » Cod sursa (job #1319644) | Cod sursa (job #1688856) | Cod sursa (job #1269899) | Cod sursa (job #188702) | Cod sursa (job #94187)
Cod sursa(job #94187)
#include <stdio.h>
#define GMAX 75050
#define VMAX 222
#define INF 666000666
int G, N, A[2][GMAX], X[GMAX], F[VMAX], Gmax, Nmax;
void read()
{
int i, j;
freopen("ghiozdan.in", "r", stdin);
scanf("%d%d", &N, &G);
for (i = 0; i < N; i++) scanf("%d", &j), F[j]++;
}
void solve()
{
int i, g, s = 0, d = 1, fmax = 0;
for (i = 0; i < VMAX; i++)
if (F[i]) fmax = i;
for (g = 0; g < GMAX; g++)
for (i = 0; i < 2; i++) A[i][g] = INF;
for (i = 0; i < VMAX; i++)
if (F[i])
{
A[s][0] = 0;
for (g = i; g <= G && F[i]; g += i)
A[s][g] = A[s][g-i]+1, F[i]--;
for (g = G; g > 0; g--)
if (A[s][g]<INF) break;
if (Gmax<g) Gmax = g, Nmax = A[s][g];
break;
}
for (i++; i <= fmax; i++)
{
if (F[i]) A[d][0] = 0;
for (g = 0; g <= G; g++) A[d][g] = A[s][g];
for (g = i; g <= G; g++)
{
if (F[i])
if (A[d][g]>A[s][g-i]) A[d][g] = A[s][g-i]+1, X[g] = 1;
if (X[g-i]+1<=F[i])
if (A[d][g]>A[d][g-i]) A[d][g] = A[d][g-i]+1, X[g] = X[g-i]+1;
}
for (g = G; g > 0; g--)
if (A[d][g]<INF) break;
if (Gmax<g) Gmax = g, Nmax = A[d][g];
else
if (Gmax==g&&Nmax>A[d][g]) Nmax = A[d][g];
s = (s+1)&1; d = (d+1)&1;
for (g = 0; g <= G; g++) A[d][g] = INF, X[g] = 0;
}
}
void write()
{
freopen("ghiozdan.out", "w", stdout);
printf("%d %d\n", Gmax, Nmax);
}
int main()
{
read();
solve();
write();
return 0;
}