Cod sursa(job #437885)

Utilizator dotooreSerbanescu Radu Marian dotoore Data 10 aprilie 2010 10:38:31
Problema Gutui Scor 0
Compilator cpp Status done
Runda teme_upb Marime 1.17 kb
#include<iostream.h>
#include<fstream.h>
#include<conio.h>
struct Gutui
	{
	long h,g;
	}*v;
long n,h,pas,i,j,k,gmax,nmax,s,nr,*x;
void citire_fisier ()
{
ifstream f("gutui.in");
f>>n>>h>>pas;
v= new Gutui [n];
x= new long[n];
for(i=1;i<=n;i++)
f>>v[i-1].h>>v[i-1].g;
f.close();
}
void analiza(long *x,long n)
{
long a;
s=0;  //ne intereseaza greutatea cea mai mare
nr=0; //si nr cat mai mare de gutui
for(a=0;a<n;a++)
	if(v[x[a]].h+a*pas<=h)
		{
		s+=v[x[a]].g;
		nr++;
		}
if(s>gmax) gmax=s;
else if(s==gmax && nr>nmax) nmax=nr;
}
void permutari(long n)
{
for(i=0;i<n;i++)x[i]=i;
analiza(x,n);
do
	{
	k=n-2;
	while(x[k]>x[k+1] && k>=0) k--;
	if(k>=0)
		{
	j=n-1;
	while(x[j]<=x[k]) j--;
	x[k]=x[k]+x[j];
	x[j]=x[k]-x[j];
	x[k]=x[k]-x[j];
	if(k<n-2)
	for(i=1;i<=(n-1-k)/2;i++)
		{
		x[k+i]=x[k+i]+x[n-i];
		x[n-i]=x[k+i]-x[n-i];
		x[k+i]=x[k+i]-x[n-i];
		}
	analiza(x,n);
		}
     }while(k>=0);
}
void main()
{
//FILE *f2;
clrscr();
citire_fisier();
//cout<<n<<" "<<h<<" "<<pas<<endl;
//for(i=0;i<n;i++)
//cout<<v[i].h<<" "<<v[i].g<<endl;
permutari(n);
cout<<"greutatea maxima este: "<<gmax;
delete x;
delete v;
getch();
}