此题我在vj提交一直runtime error,请求指导

#include<algorithm>
#include<cstdio>
using namespace std;

int main(){
    int m,n;
    while(cin>>m>>n){
        int j[1100]={0},f[1100]={0};
        double sum=0;
        if(m!=-1 || n!=-1){
            for(int i = 0;i < n; i++){
                cin>>j[i]>>f[i];  
            }
            //对效率进行排序
            for(int i = 0;i <= n; i++){
                for(int k = i+1;k <= n-1; k++){
                    if(1.0*j[k]/f[k]>1.0*j[i]/f[i])
                    {
                        j[k]+=j[i];
                        j[i]=j[k]-j[i];
                        j[k]-=j[i];
                        f[k]+=f[i];
                        f[i]=f[k]-f[i];
                        f[k]-=f[i];    
                    }
                }
            }
            int i=0;
            while(m>f[i]){
                m-=f[i];
                sum+=j[i];
                i++;
            }
            sum+=1.0*m/f[i]*j[i];
            printf("%.3lf\n",sum);
        } else break;
    }
    return 0;
}

胖鼠准备了M磅猫粮,准备和看守仓库的猫交易,仓库里有他最喜欢的食物——爪哇豆。

这个仓库有N个房间。第i个房间里有J[i]磅的爪哇豆,需要F[i]磅的猫粮。胖鼠不必用房间里所有的爪哇豆来交换,相反,如果他支付F[i]*a%磅的猫粮,他可能会得到J[i]*a%磅的爪哇豆。这是一个实数。现在他给你布置了一个家庭作业:告诉他可以获得的JavaBeans的最大数量。

输入

输入由多个测试用例组成。每个测试用例从一行开始,该行包含两个非负整数M和N。然后是N行,每个行分别包含两个非负整数J[i]和F[i]。最后一个测试用例后面是两个-1。所有整数都不大于1000。

输出

对于每个测试用例,在一行中打印一个精确到小数点后3位的实数,这是FatMouse可以获得的最大JavaBeans数量。

Sample Input
  5  3
  7  2
  4  3
  5  2
  20  3
  25  18
  24  15
  15  10
  -1  -1
Sample Output
  13.333
  31.500

不懂你这个算法,但是感觉这里while(m>f[i])不太对。