Cod sursa(job #425701)

Utilizator ShmazZamfirache Virgil Shmaz Data 25 martie 2010 23:10:58
Problema Gutui Scor 0
Compilator cpp Status done
Runda teme_upb Marime 3.19 kb
/* Zamfirache Virgil - 323CC
 * PA - TEMA 1 - PROBLEMA 2*/

#include <iostream>
#include <stdlib.h>

using namespace std;


int max2( int a, int b  )
{
    int max ;
    
    max = ( a > b ) ? a : b ;
    
    return max;    
    
}

void free_matrix( int n, int **a) {
	int i;
	for ( i = 0 ; i < n ; i++) {
		free( a[ i ] );
	}
	free( a );
}

void gutui( int * height, int *weight, int N, int H, int U )
{	
	FILE *out ;

    out =  fopen ( "gutui.out", "w" );
    int i , h ;
    int *A , *B;
    A = (int * ) calloc ( H + 1 , sizeof ( int * ));
    B = (int * ) calloc ( H + 1 , sizeof ( int * ));
    
    //for ( h = 10 ; h <= H  ; h ++ ){
		
    for ( i = 1 ; i <= N ; i ++) {
        for ( int p = 0 ; p <= H ; p++ ){
       	    A[ p ] = B[ p ] ;
		}
		for ( h = height [ i - 1 ] ; h <= H ; h ++ ){
			if ( A [ h - U ] +  weight[ i - 1] > A [ h ] )
   			    B[ h ] = A[ h -  U ] + weight[ i - 1 ] ;
		}
    }
   	/*for ( int p = 0 ; p <= H ; p++ ){ 
    	cout << B[p]<<endl;
    }*/
		//	cout<<endl<<" H : "<< height[ i - 1 ]<<" W:" <<weight [ i - 1] <<endl;
		//	aux[ h ][ i ] = ( height[ i - 1 ] <= h ) ? max2 ( aux [ h ][ i - 1 ], aux [ h - 10 ][ i - 1 ] + weight [ i - 1  ] ) : aux [ h ][ i - 1 ];
		//	if ( h[ i ] < = H ) {
  		//	cout <<"a["<<h<<"]["<<i<<"]="<<aux[h][i]<<" "<<endl;
           // }

	//	cout<<endl;
	//	system("pause");
	fprintf ( out , "%d", B[H]);
    fclose ( out ) ;
}


/*
void gutui( int * height, int *weight, int N, int H, int U )
{
    int i , h ;
    int **aux;
    aux = (int ** ) calloc ( H + 1 , sizeof ( int * ));
	for ( i = 0 ; i <= H  ; i ++ ) {
	    aux[ i ] = ( int * ) calloc ( ( N + 1 ) , sizeof ( int ) );
	} 
    
    for ( h = 10 ; h <= H  ; h ++ ){
		
		for ( i = 1 ; i <= N ; i ++) {
		//	cout<<endl<<" H : "<< height[ i - 1 ]<<" W:" <<weight [ i - 1] <<endl;
			aux[ h ][ i ] = ( height[ i - 1 ] <= h ) ? max2 ( aux [ h ][ i - 1 ], aux [ h - 10 ][ i - 1 ] + weight [ i - 1  ] ) : aux [ h ][ i - 1 ];
		//	if ( h[ i ] < = H ) {
  			cout <<"a["<<h<<"]["<<i<<"]="<<aux[h][i]<<" "<<endl;
           // }
		}	
		cout<<endl;
	//	system("pause");
	}
}
*/
void read( char *fname , int **height, int **weight , int *N, int *H, int *U )
{
    FILE *in ;
    int i, j;
    char *str;
    in =  fopen ( fname, "r" );
    
    fscanf(in, "%d", N);
    fscanf(in, "%d", H);
    fscanf(in, "%d", U);
	
	// elementele matricei A
	*height = (int*)calloc(( *N ) , sizeof(int*));
	*weight = (int*)calloc(( *N ) , sizeof(int*));
	for ( i = 0; i < *N ; i++) {

			fscanf(in, "%d", &( ( *height )[ i ] ));
			fscanf(in, "%d", &( ( *weight )[ i ] ));
		
	}

	fclose ( in );
    
}

int main()
{
    int *height, *weight;
    int i, j;
    /*N (numarul de gutui din copac), H (inaltimea maxima la care ajunge Gigel) si 
	U (cu cat se ridica crengile copacului dupa culegerea unei gutui).*/
    int N, H, U;
    char in_name[] = "gutui.in";

    read( in_name, &height, &weight, &N, &H, &U);
    
	/*for ( i = 1; i <= N ; i++) {
			cout<< height[ i - 1  ]<< " " << weight[ i -1  ]  ;
				cout<<endl;
	}	*/
			
			
    gutui( height, weight, N, H, U );
	//system("pause");
    return 0;
}