Cod sursa(job #1751421)

Utilizator ArkinyStoica Alex Arkiny Data 1 septembrie 2016 13:41:06
Problema Ghiozdan Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.78 kb
#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;
}