Pagini recente » Cod sursa (job #1043649) | Cod sursa (job #1907285) | Cod sursa (job #1711283) | Cod sursa (job #1872669) | Cod sursa (job #1751421)
#include<fstream>
#include<algorithm>
#include<vector>
using namespace std;
ifstream in("ghiozdan.in");
ofstream out("ghiozdan.out");
int v[20010];
int D[2][75010][2];
vector<int> E[2][75010];
void copy_vector(vector<int> &a, vector<int> &b)
{
if (b.size())
a = b;
}
int main()
{
int N, G;
in >> N >> G;
for (int i = 1;i <= N;++i)
in >> v[i];
for (int i = 1;i <= N;++i)
for (int w = 1;w <= G;++w)
{
if (v[i] > w)
D[i % 2][w][0] = D[(i + 1) % 2][w][0], D[i % 2][w][1]= D[(i + 1) % 2][w][1],copy_vector(E[i%2][w],E[(i+1)%2][w]);
else if (D[(i + 1) % 2][w - v[i]][0] + v[i] <= G)
{
if (D[(i + 1) % 2][w][0] > D[(i + 1) % 2][w - v[i]][0] + v[i])
D[i % 2][w][0] = D[(i + 1) % 2][w][0], D[i % 2][w][1] = D[(i + 1) % 2][w][1], copy_vector(E[i % 2][w],E[(i + 1) % 2][w]);
else if (D[(i + 1) % 2][w][0] < D[(i + 1) % 2][w - v[i]][0] + v[i])
{
D[i % 2][w][0] = D[(i + 1) % 2][w - v[i]][0] + v[i], D[i % 2][w][1] = D[(i + 1) % 2][w - v[i]][1] + 1, copy_vector(E[i % 2][w],E[(i + 1) % 2][w - v[i]]);
E[i % 2][w].push_back(v[i]);
}
else if (D[(i + 1) % 2][w - v[i]][1] + 1 < D[(i + 1) % 2][w][1])
D[i % 2][w][0] = D[(i + 1) % 2][w][0],D[i % 2][w][1] = D[(i + 1) % 2][w - v[i]][1] + 1, copy_vector(E[i % 2][w],E[(i + 1) % 2][w - v[i]]), E[i % 2][w].push_back(v[i]);
else
D[i % 2][w][0] = D[(i + 1) % 2][w][0],D[i % 2][w][1] = D[(i + 1) % 2][w][1], copy_vector(E[i % 2][w],E[(i + 1) % 2][w]);
}
else
D[i % 2][w][0] = D[(i + 1) % 2][w][0], D[i % 2][w][1] = D[(i + 1) % 2][w][1], copy_vector(E[i % 2][w],E[(i + 1) % 2][w]);
}
out << D[N % 2][G][0]<< " " << D[N % 2][G][1]<<'\n';
for (int i = 0;i < E[N % 2][G].size();++i)
out << E[N % 2][G][i] << '\n';
return 0;
}