Pagini recente » Cod sursa (job #1457883) | Cod sursa (job #1132890) | Cod sursa (job #2243066) | Cod sursa (job #272100) | Cod sursa (job #235329)
Cod sursa(job #235329)
#include <cstdio>
#include <algorithm>
const int maxn = 20001;
const int maxg = 75001;
const int inf = 1 << 29;
FILE *in = fopen("ghiozdan.in","r"), *out = fopen("ghiozdan.out","w");
int n, g;
int nr[maxn], a[maxg], rec[maxg];
bool cmp(int x, int y)
{
return x > y;
}
void readinit()
{
fscanf(in, "%d %d", &n, &g);
for ( int i = 1; i <= n; ++i )
fscanf(in, "%d", &nr[i]);
std::sort(nr+1, nr+n+1, cmp);
for ( int i = 1; i <= g; ++i )
a[i] = inf;
}
void go()
{
int sum = 0;
for ( int i = 1; i <= n && a[g] == inf; ++i )
{
sum += nr[i];
sum > g ? sum = g : 0;
for ( int j = sum; j >= nr[i]; --j )
if ( a[j - nr[i]] + 1 < a[j] )
{
a[j] = a[j - nr[i]] + 1;
rec[j] = nr[i];
}
}
while ( a[g] == inf )
--g;
fprintf(out, "%d %d\n", g, a[g]);
while ( g )
{
fprintf(out, "%d\n", rec[g]);
g -= rec[g];
}
}
int main()
{
readinit();
go();
return 0;
}