Cod sursa(job #664777)

Utilizator s8ko14romario s8ko14 Data 20 ianuarie 2012 19:35:07
Problema Gutui Scor 10
Compilator cpp Status done
Runda teme_upb Marime 1.93 kb
#include<stdio.h>
int n,in_max,ridicare,smax=0;
struct fruct
{
	int inaltime;
	int greutate;
	int poz;//pozitia gutuii
};
fruct a[100],copie[100],sol[100],b[100];

int bun(int k)
{
	
	for(int i=0;i<k;i++)
		if(sol[i].poz==sol[k].poz)
			return 0;
	for(int i=0;i<n;i++)//aici ridic gutuile cu "ridicare" si daca le am ridicat prea mult transform inaltimea gutuii in -1
		if(copie[i].inaltime>=0)
		{
			if(copie[i].inaltime!=-1)
				copie[i].inaltime=copie[i].inaltime+ridicare;
			if(copie[i].inaltime>in_max)
				copie[i].inaltime=-1;
		}
	return 1;
}

int reinitializare_copie(int k)
{
	for(int i=0;i<n;i++)//copiez in copie vectoru a
	{
		copie[i].inaltime=a[i].inaltime;
		copie[i].greutate=a[i].greutate;
	}
	for(int i=0;i<n;i++)//ridic gutuile de atatea ori de cate pozitii am completate in vectorul sol
		copie[i].inaltime=copie[i].inaltime+ridicare*k;
}


int solutie(int k,int &s)//este solutie daca nu mai pot ridica nici o gutuie , toate fiind prea sus
{
	s=0;
	for(int i=0;i<=k;i++)
	{
		s=s+sol[i].greutate;
		if(copie[i].inaltime!=-1)
			return 0;
	}
	return 1;
}

void retin_suma(int s)
{
	if(s>smax)
		smax=s;
}

int back(int k)
{
	int s;
	for(int i=0;i<n;i++)
	{
		if(copie[i].inaltime!=-1)
		{	sol[k].inaltime=copie[i].inaltime;	sol[k].greutate=copie[i].greutate;	sol[k].poz=i;	}//completez vectorul sol
		if(bun(k))
			if(solutie(k,s))//este solutie daca nu mai pot ridica nici o gutuie , toate fiind prea sus
			{
				retin_suma(s);
				reinitializare_copie(k);
			}
			else
				back(k+1);
	}
}
		
		
int main()
{
	FILE *f=fopen("gutui.in","rt");
	FILE *g=fopen("gutui.out","wt");
	fscanf(f,"%i%i%i",&n,&in_max,&ridicare);
	for(int i=0;i<n;i++)
		fscanf(f,"%i%i",&a[i].inaltime,&a[i].greutate);
	for(int i=0;i<n;i++)//copiez pe a(vectoru care retine gutuile) in copie
	{	copie[i].inaltime=a[i].inaltime; copie[i].greutate=a[i].greutate; }
	back(0);
	fprintf(g,"%i",smax);
}