Cod sursa(job #4341)

Utilizator cosminstefanxpStefan Dobrin Cosmin cosminstefanxp Data 2 ianuarie 2007 18:34:10
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include<fstream.h>
int ct[100000]={0},g[20000],c[20000],ok,i,j,n,w,min,max,maxt;
int main()
{

	ifstream f("energii.in");
	ofstream fout("energii.out");
	f>>n;
	f>>w;
	maxt=0;
	for(i=1;i<=10001;i++)
      ct[i]=-1;
	for(i=1;i<=n;i++)
		{f>>g[i]; f>>c[i];}
	maxt=0;
	max=0;
	for(i=1;i<=n;i++)
		 {for(j=max;j>=0;j--)
			  if((j==0||ct[j]!=-1)&&ct[j+g[i]]==-1)
					{
					 ct[j+g[i]]=ct[j]+c[i]+1;
					 if(j+g[i]>max) max=j+g[i];}
				 else
					 if(j!=0&&ct[j]!=-1&&ct[j+g[i]]<ct[j]+c[i])
						{ct[j+g[i]]=ct[j]+c[i];
						 if(j+g[i]>max) max=j+g[i];}
						else
						  if(j==0&&ct[j+g[i]]<ct[j]+c[i])
							 { ct[j+g[i]]=ct[j]+c[i]+1;
								if(j+g[i]>max) max=j+g[i];}

		  if(max>=w) {if(maxt<max) maxt=max;
						 max=w;}
		  }
	 min=32000;
	 if(maxt==0) {fout<<"-1"; return 0;}
	 if(maxt==w) {fout<<ct[w]; return 0;}
	 for(i=w;i<=maxt;i++)
		  if(min>ct[i]&&ct[i]!=0) min=ct[i];
	 fout<<min;
	 f.close();
	 fout.close();
	return 0;
	 }