Pagini recente » Cod sursa (job #1059796) | Cod sursa (job #2442084) | Cod sursa (job #502582) | Cod sursa (job #2447427) | Cod sursa (job #1926250)
#include <bits/stdc++.h>
#define maxN 20001
#define maxG 75001
#define maxW 201
using namespace std;
FILE *fin = freopen("ghiozdan.in", "r", stdin);
FILE *fout = freopen("ghiozdan.out", "w", stdout);
/* ------------- */
int n, g;
/* ------------- */
struct Dp
{
int prv, nro, obj;
} dp[maxG + 1];
int t, frq[maxW + 1];
/* ------------- */
int gmax;
void read()
{
scanf("%d %d", &n, &g);
for (int i = 1; i <= n; ++ i)
{
int w;
scanf("%d", &w);
++ frq[w];
}
}
void init()
{
dp[0].nro = 0; ///
for (int i = 1; i < maxG; ++ i)
dp[i] = {0, maxN, 0};
}
void solve()
{
init();
for (int i = maxW - 1; i >= 1; -- i)
if (frq[i])
{
for(int j = g - i; j >= 0; -- j)
{
if (dp[j].nro != maxN)
{
for (int k = 1; k <= frq[i] && j + k * i <= g && dp[j + k * i].nro == maxN; ++ k)
{
if (dp[j + k * i].nro > dp[j].nro + k)
{
dp[j + k * i].nro = dp[j].nro + k;
dp[j + k * i].obj = i;
dp[j + k * i].prv = j;
}
if (dp[j + k * i].nro != maxN && j + k * i > gmax)
gmax = j + k * i;
}
}
}
}
}
void write()
{
printf("%d %d\n", gmax, dp[gmax].nro);
int G = gmax;
while (G)
{
for (int i = 1; i <= (G - dp[G].prv) / dp[G].obj; ++ i)
printf("%d\n", dp[G].obj);
G = dp[G].prv;
}
}
int main()
{
read();
solve();
write();
return 0;
}