Fibonaccibug aiutatemi prima di impazzire

Come mai mi da errato dal secondo subtask in poi? Il codice mi sembra corretto e funziona sui casi esempio più altri che ho creato personalmente. Mi dà errore di output e di tempo.

#include <iostream>
using namespace std;

#define MAXN 1000000

long long int T, N, M, K, i, j, A[MAXN], B[MAXN], soluzioni[MAXN];

long long int fib(long long int num ){
if(num==0) return 1;
else if(num==1) return 1;
else return fib(num-1)+fib(num-2);
}

struct oggetto{
    long long int peso, valore;
};
oggetto oggetti[MAXN];

long long int knapsack_bottom_up(long long int num){
    for(int y=0;y<N;y++){
        for(int g=0;g<= M-oggetti[i].peso;g++){
                if(soluzioni[g] + oggetti[y].valore > soluzioni[g+oggetti[y].peso] ){
                    soluzioni[g+oggetti[y].peso]=soluzioni[g]+oggetti[y].valore;
                }
        }
    }
    return soluzioni[M];
}

int main()
{

    cin>>T;
    long long int result[T];
    cin>>N>>M;
    for(i=0; i<T; i++) {
        for (j=0; j<N; j++){
            cin>>A[j]>>B[j];
            A[j]=fib(A[j]);
            oggetti[j].peso=A[j];
            oggetti[j].valore=B[j];
        }
        for(int r = 0; r < N ; r++) soluzioni[r]=0;
        result[i] = knapsack_bottom_up(M);
    }
    for(i=0;i<T;i++) cout<<result[i]<<endl;
}

Per quanto riguarda il tempo la funzione ricorsiva di Fibonacci è molto dispendiosa, calcola moltissime volte gli stessi valori. Puoi verificare ciò scrivendo su un foglio tutte le chiamate a funzione che vengono effettuate.
Negli esercizi in cui è necessario calcolare parecchie volte valori della sequenza di Fibonacci è sempre meglio pre-calcolarli in modo iterativo e metterli in un array f, dove f[i] è l’i-esimo termine della sequenza di Fibonacci.

Tieni presente che Fib[26]>100000 !!