Cod sursa(job #1751424)

Utilizator ArkinyStoica Alex Arkiny Data 1 septembrie 2016 13:42:40
Problema Ghiozdan Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 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];

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];
			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];
				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;
				}
				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;
				else
					D[i % 2][w][0] = D[(i + 1) % 2][w][0],D[i % 2][w][1] = D[(i + 1) % 2][w][1];
			}
			else
				D[i % 2][w][0] = D[(i + 1) % 2][w][0], D[i % 2][w][1] = D[(i + 1) % 2][w][1];
		}



	out << D[N % 2][G][0]<< " " << D[N % 2][G][1]<<'\n';

	
	
	return 0;
}