Pagini recente » Cod sursa (job #1597831) | Cod sursa (job #860144) | Cod sursa (job #104469) | Cod sursa (job #1215566) | Cod sursa (job #50376)
Cod sursa(job #50376)
#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);
}