Pagini recente » Cod sursa (job #1471752) | Cod sursa (job #697947) | Cod sursa (job #2046368) | Cod sursa (job #2036155) | Cod sursa (job #50414)
Cod sursa(job #50414)
#include <cstdio>
#define Gdim 75001
#define Vdim 201
int N, Max, Min = Vdim;
int Nmin[2][Gdim], C[Vdim], Last[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;
Last[j*Min] = 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;
Last[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 > 0)
{
printf("%d\n", Last[Gmax]);
Gmax -= Last[Gmax];
if(!Last[Gmax]) break;
}
fclose(stdout);
}