Cod sursa(job #577531)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 10 aprilie 2011 13:07:13
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<fstream>
using namespace std;
int n,W,e[1005],cost[1005],costmin[10000],sum;
short uz[10000][1005];
ofstream fout("energii.out");
void Rezolva()
{
	int S,i,j,limita,nr,gata;
	limita=W+4995;
	for(S=1;S<=limita;S++)
		costmin[S]=2000000000;
	for(S=1;S<=W;S++)
	{
		for(i=1;i<=n;i++) 
		{
			if(e[i]<=S && uz[S-e[i]][i]==0 && costmin[S-e[i]]!=2000000000)
			{
				if(costmin[S]>cost[i]+costmin[S-e[i]])
				{
					costmin[S]=cost[i]+costmin[S-e[i]];
					nr=0;
					for(j=1;j<=n;j++)
					{
						uz[S][j]=uz[S-e[i]][j];
						if(uz[S][j]==1)
							nr++;
					}
					uz[S][i]=1; 
					nr++;
					uz[S][0]=nr;
				}
			}
		}
	}
	if(costmin[W]==2000000000)
	{
		gata=0;
		for(S=W+1;!gata && S<=limita;S++)
		{
			for(i=1;i<=n;i++) 
			{
				if(e[i]<=S && uz[S-e[i]][i]==0 && costmin[S-e[i]]!=2000000000)
				{
					if(costmin[S]>cost[i]+costmin[S-e[i]])
					{
						costmin[S]=cost[i]+costmin[S-e[i]];
						nr=0;
						for(j=1;j<=n;j++)
						{
							uz[S][j]=uz[S-e[i]][j];
							if(uz[S][j]==1)
								nr++;
						}
						uz[S][i]=1; 
						nr++;
						uz[S][0]=nr;
					}
				}
			}
			if(costmin[S]!=2000000000)
				gata=costmin[S];
			else
				if(S>sum || S==limita)
					gata=-1;
		}
		fout<<gata<<"\n";
		fout.close();
	}
	else
	{
		fout<<costmin[W]<<"\n";
		fout.close();
	}
}

int main()
{
	int i;
	ifstream fin("energii.in");
	fin>>n>>W;
	for(i=1;i<=n;i++)
		fin>>e[i]>>cost[i];
	fin.close();
	for(i=1;i<=n;i++)
		sum+=e[i];
	if(sum<W)
	{
		fout<<"-1"<<"\n";
		fout.close();
	}
	else
		Rezolva();
	return 0;
}