Pagini recente » Cod sursa (job #2530796) | Cod sursa (job #910251) | Cod sursa (job #2586882) | Cod sursa (job #278494) | Cod sursa (job #3140115)
#include <fstream>
#include <algorithm>
#include <bitset>
#include <vector>
using namespace std;
string file = "ghiozdan";
ifstream cin (file + ".in");
ofstream cout (file + ".out");
struct ura{
short x,nr;
};
vector <ura> v[75001];
vector <int> available;
short obiecte[201], marimi[75001];
int g;
void efectuare_rucsac(short x, bool &ok)
{
vector <int> temp;
for (int greutate : available)
{
int y = greutate+x;
if (y > g)
continue;
if (!marimi[y])
{
ok = 1;
temp.push_back(y);
v[y] = v[greutate];
marimi[y] = marimi[greutate] + 1;
if (v[y].back().x == x)
{
v[y].back().nr++;
}
else
{
v[y].push_back({x,1});
}
}
else if (marimi[greutate] + 1 < marimi[y])
{
ok = 1;
v[y] = v[greutate];
marimi[y] = marimi[greutate] + 1;
if (v[y].back().x == x)
{
v[y].back().nr++;
}
else
{
v[y].push_back({x,1});
}
}
}
for (int x : temp)
{
available.push_back(x);
}
}
int main()
{
short n,x;
cin >> n >> g;
for (int i=1; i<=n; i++)
{
cin >> x;
obiecte[x]++;
}
for (short i=200; i>=1; i--)
{
bool ok;
if (obiecte[i])
{
obiecte[i]--;
efectuare_rucsac(i,ok);
v[i] = {{i,1}};
if (!marimi[i])
{
available.push_back(i);
}
marimi[i] = 1;
}
while (obiecte[i]--)
{
ok = 0;
efectuare_rucsac(i,ok);
if (!ok)
break;
}
}
for (int i=g; i>=1; i--)
{
if (marimi[i])
{
cout << i << ' ' << marimi[i];
for (ura x : v[i])
{
while (x.nr--)
{
cout << '\n' << x.x;
}
}
break;
}
}
}