#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;
}