Cod sursa(job #434428)

Utilizator DetudaArthur Koestler Detuda Data 5 aprilie 2010 21:41:48
Problema Gutui Scor 0
Compilator c Status done
Runda teme_upb Marime 1.52 kb
#include <stdio.h>
#include <string.h>

long u;
long max2(long a, long b)
{
	return (a>b)?a:b;
}

long max3(long a, long b, long c)
{
	return max2(a, max2(b,c));
}

long m(long i, long j, long h[], long w[])
{
	if(i==0 || j==0)
	return 0;
	else 
	{
		// if(h[i]>j)
		if(h[i]+(u*(i-1))>j)
		return m(i-1, j, h, w);
		else
		return max3( m(i-1, j, h, w), m(i-1, j-h[i], h, w) + w[i], m(i, j-1, h, w));
	}
}
	


int main()
{
	// nr gutui, inaltimea maxima, inaltarea, rezultatul final
	long n, hi, smax=0;
	// inantimea fiecarei gutui si greutatea
	long h[100001], w[100001], i, j, aux;
	long hmin;

	FILE *f=fopen("gutui.in", "r");
	FILE *g=fopen("gutui.out", "w");
	fscanf(f, "%ld %ld %ld", &n, &hi, &u);

	for(i=1; i<=n; i++)
	fscanf(f, "%ld %ld", &h[i], &w[i]);
	//trebuie inlocuit cu quicksort, de exemplu
	for(i=1; i<=n-1; i++)
	for(j=i+1; j<=n; j++)
	if(h[i]<h[j])
	{
	aux=h[i];
	h[i]=h[j];
	h[j]=aux;
	aux=w[i];
	w[i]=w[j];
	w[j]=aux;
	}
	printf("Dupa quicksort: \n");
	for(i=1; i<=n; i++)
	printf("fructul %ld are inaltimea %ld si greutatea %ld\n", i, h[i], w[i]);
	
	hmin=h[n-1];
	printf("hmin este: %ld\n", hmin);
//pana aici sigur e bine

/*	
	//cazurile de baza
	for(i=0; i<=hi; i++)
	m[0][i]=0;
	for(i=0; i<=n; i++)
	m[i][0]=0;
	//recurenta

	for(i=1; i<=n; i++)
	for(j=1; j<=hi; j++)
	{
		if(h[i]>j)
		m[i][j]=m[i-1][j];
		if(h[i]<=j)
		m[i][j]=max3(m[i-1][j], m[i-1][j-h[i]]+w[i], m[i][j-1]);
	}
	smax=m[n][hi];
*/

	smax=m(n, hi, h, w);
	printf("%ld\n", smax);
	fprintf(g, "%ld", smax);
	
	fclose(f);
	fclose(g);
	return 0;
}