#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define INF 1000
void swap(int *x,int *y)
{
int temp;
temp = *x;
*x = *y;
*y = temp;
}
int choose_pivot(int i,int j )
{
return((i+j) /2);
}
void quicksort(int list[], int list2[],int m,int n)
{
int key,i,j,k;
if( m < n)
{
k = choose_pivot(m,n);
swap(&list[m],&list[k]);
swap(&list2[m],&list2[k]);
key = list[m];
i = m+1;
j = n;
while(i <= j)
{
while((i <= n) && (list[i] >= key))
i++;
while((j >= m) && (list[j] < key))
j--;
if( i < j)
{
swap(&list[i],&list[j]);
swap(&list2[i],&list2[j]);
}
}
// swap two elements
swap(&list[m],&list[j]);
swap(&list2[m],&list2[j]);
// recursively sort the lesser list
quicksort(list,list2,m,j-1);
quicksort(list,list2,j+1,n);
}
}
void printlist(int list[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%i ",list[i]);
printf("\n");
}
int main()
{
int N, H, U, i, j, k, max;
int* inaltime;
int* greutate;
int** scor;
FILE* f;
FILE* g;
f= fopen("gutui.in","r");
fscanf(f, "%i %i %i\n", &N, &H, &U);
inaltime = (int*)calloc(N,sizeof(int*));
greutate = (int*)calloc(N,sizeof(int*));
scor = (int**)calloc(N,sizeof(int*));
for (i=0; i<N; i++)
{
fscanf(f, "%i %i\n", &inaltime[i], &greutate[i]);
scor[i] = (int*)calloc(N,sizeof(int));
}
//Sortez descrescator dupa inaltime gutuile (deci se modifica si inaltime[] si greutate[]).
quicksort(inaltime,greutate,0,N-1);
//prima coloana a matricii scor va fi initializata cu greutatile
for (i=0;i<N;i++)
if (inaltime[i]<=H)
scor[i][0] = greutate[i];
else
scor[i][0] = -INF;
for (i=0;i<N;i++)
for(j=1;j<N;j++)
if (inaltime[i]+j*U <= H) //daca gutuia nu este prea sus
{
max=0;
//calculez maximul de pe coloana k-1
for(k=0;k<i;k++)
if (scor[k][j-1]>max)
max=scor[k][j-1];
//scor[i][j] = cea mai mare cantitate ce o pot recolta alegand dintre gutuile {1,2,...i}, ultima gutuie aleasa
//fiind gutuia i si fiind a j+1 -a (adica au mai fost alese inainte j gutui)
scor[i][j] = greutate[i] + max;
}
else scor[i][j] = -INF;
//aflu greutatea maxima
max=0;
for (i=1;i<N;i++)
{
for (j=0;j<N;j++)
{
if (scor[i][j]>max)
max=scor[i][j];
//printf("%i ",scor[i][j]);
}
//printf("\n");
}
g= fopen("gutui.out","w");
fprintf(g, "%i", max);
fclose(f);
fclose(g);
free(scor);
free(inaltime);
free(greutate);
return 0;
}