Cod sursa(job #1109896)

Utilizator raulstoinStoin Raul raulstoin Data 17 februarie 2014 18:08:09
Problema Ghiozdan Scor 64
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include<fstream>
#include<vector>
#include<bitset>

#define NMAX 205
#define GMAX 75005
#define Min min(j/i,v[i])

using namespace std;

ifstream fin("ghiozdan.in");
ofstream fout("ghiozdan.out");

struct obiect
{
	int greutate,nr,valmax;
	bitset<NMAX> use;
	obiect()
	{
		greutate=nr=valmax=0;
	}
}DP[2][GMAX];

int n,g,v[NMAX];
vector<int> sol;

int main()
{
	fin>>n>>g;
	for(int i=1,x;i<=n;i++)
	{
		fin>>x;
		v[x]++;
	}
	int l=0;
	for(int i=1;i<=200;i++)
	{
		if(!v[i])
			continue;
		for(int j=0;j<=g;j++)
		{
			DP[1-l][j]=DP[l][j];
			if(DP[l][j-Min*i].greutate+Min*i==DP[1-l][j].greutate)
				DP[1-l][j].nr=min(DP[1-l][j].nr,DP[l][j-Min*i].nr+Min);
			if(DP[l][j-Min*i].greutate+Min*i>DP[1-l][j].greutate)
			{
				DP[1-l][j]=DP[l][j-Min*i];
				DP[1-l][j].greutate+=Min*i;
				DP[1-l][j].nr+=Min;
				DP[1-l][j].valmax=i;
			}
		}
		l=1-l;
	}
	fout<<DP[l][g].greutate<<' '<<DP[l][g].nr<<'\n';
	for(int i=DP[l][g].valmax,val=DP[l][g].greutate;i;i--)
		while(i<=val && v[i]--)
		{
			sol.push_back(i);
			val-=i;
		}
	for(int i=sol.size()-1;i>=0;i--)
		fout<<sol[i]<<'\n';
	return 0;
}