Pagini recente » Cod sursa (job #1406386) | Cod sursa (job #1370937) | Cod sursa (job #1096231) | Cod sursa (job #1667641) | Cod sursa (job #2849513)
#include <fstream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
ifstream fin("ghiozdan.in");
ofstream fout("ghiozdan.out");
vector <int> out;
vector <map <int, int>> poz;
map <int, int> m;
int n, g, i, j, gr[20001], d[75001];
bool canBeAdded(int j, int gr)
{
if (poz[j].find(gr) == poz[j].end())
return 1;
else if (poz[j][gr] < m[gr]) return 1;
return 0;
}
int main()
{
fin >> n >> g;
for (i = 1; i <= n; i++)
{
fin >> gr[i];
if (m.find(gr[i]) == m.end())
m.insert ({gr[i], 1});
else m[gr[i]]++;
}
for (i = 1; i <= g; i++)
d[i] = 1e8;
poz.resize(g+1);
for (i = 1; i <= n; i++)
{
int ok = 1;
for (j = g; j >= gr[i]; j--)
{
if (d[j] > d[j-gr[i]]+1 && canBeAdded(j, gr[i]))
{
poz[j] = poz[j-gr[i]];
if (poz[j].find(gr[i]) == poz[j].end())
poz[j].insert({gr[i], 1});
else poz[j][gr[i]]++;
d[j] = d[j-gr[i]]+1;
ok = 0;
}
}
}
for (i = g; i > 0; i--)
{
if (d[i] != 1e8)
{
fout << i << " " << d[i] << "\n";
break;
}
}
map <int, int>::iterator it;
for (it = poz[i].begin(); it != poz[i].end(); it++)
{
for (j = 1; j <= (*it).second; j++)
fout << (*it).first << "\n";
}
return 0;
}