Problema rucsacului in limbajul C

#include<stdio.h>
int o[50]; //ordinea obiectelor
float c[100],g[100],x[100],Gr,GMax;
int n;

void citeste();
void sorteaza();
void rezolva();
void afiseaza();

int main()
{

freopen("rucsac.in","r",stdin);
freopen("rucsac.out","w",stdout);

citeste();
sorteaza();
rezolva();
afiseaza();

fclose(stdin); fclose(stdout);
return 0;
}

void citeste()
{
scanf("%d%e",&n,&GMax);
for(int i = 0; i < n; i++)
{
o[i] = i;
scanf("%e%e",&c[i],&g[i]); //citim valorile
}
}

void sorteaza()
{
int i,schimb,aux;
do //ordonam obiectele descrescator dupa castigul unitar
{
schimb = 0;
for(i = 0; i < n-1; i++)
if(c[o[i]]/g[o[i]] < c[o[i+1]]/g[o[i+1]])
{
aux = o[i];
o[i] = o[i+1];
o[i+1] = aux;
schimb = 1;
}
}while(schimb);
}

void rezolva()
{
int i;
for(i = 0,Gr = GMax; i < n && Gr > g[o[i]]; i++)
{
x[o[i]] = 1; Gr-= g[o[i]];
}
}

void afiseaza()
{
for(int i = 0; i < n; i++)
if(x[i]) printf("%d %e \n",i+1,x[i] * 100);