Pagini recente » Cod sursa (job #1346294) | Cod sursa (job #2531689) | Cod sursa (job #1126740) | Cod sursa (job #2850525) | Cod sursa (job #18643)
Cod sursa(job #18643)
using namespace std;
#include <cstdio>
#include <algorithm>
#define FIN "ghiozdan.in"
#define FOUT "ghiozdan.out"
#define NMAX 20001
#define GMAX 75001
#define INF 0x3f3f3f3f
int val[NMAX], N, K, s1[GMAX], s2[GMAX];
int minim (int x, int y)
{
if (x > y)
return y;
return x;
}
int
main ()
{
int i, j;
freopen (FIN, "rt", stdin);
freopen (FOUT, "wt", stdout);
scanf ("%d%d", &N, &K);
for (i = 1; i <= N; ++ i)
scanf ("%d", &val[i]);
for (i = 0; i <= K; ++ i)
s1[i] = INF;
for (i = 1; i <= N; ++ i)
{
s2[val[i]] = 1;
for (j = 1; j <= K; ++ j)
if (s2[j] != 1)
if (j > val[i])
s2[j] = s1[j] < s1[j - val[i]] + 1 ? s1[j] : s1[j - val[i]] + 1;
else
s2[j] = s1[j];
for (j = 1; j <= K; ++ j)
{
s1[j] = s2[j];
s2[j] = INF;
}
s1[0] = s2[0] = INF;
}
sort (val+1, val+N+1);
int sum = 0;
for (i = K; i >= 1; -- i)
if (s1[i] < INF)
{
printf ("%d %d\n", i, s1[i]);
for (j = 1; j < s1[i]; ++ j)
{
printf("%d\n", val[j]);
sum += val[j];
}
printf ("%d\n", i - sum);
break;
}
return 0;
}