如何在没有备忘录的情况下使用memoization来执行这个递归代码?

时间:2016-03-29 15:10:19

标签: c++ recursion memoization

我知道什么是memoization但是有这个递归代码:

int F(int n , int T ){

    int ganancia ;
    int maximum = INT_MIN;



    if( T >= 0  &&  n == 0){

        maximum = 0;

    }else if( T < 0){

        maximum = INT_MIN;

    } else if(T >= 0  &&  n > 0){

        for(int i = 0 ; i <= m[n-1] ; i++){

            ganancia = i*v[n-1] + F(n- 1,T- i*t[n-1]);

                if(ganancia > maximum){

                    maximum = ganancia;

                }
        }
    }

    return maximum;
}

我不知道如何转化为记忆。我做过类似的事情:

int F_alm(int n, int T){

    int ganancia ;
    int maximum = INT_MIN;

    //PETA POR ESTO
    if(almacen_rec[n-1][T] != -1){

        return almacen_rec[n-1][T];

    }else if( T >= 0  &&  n == 0){

        maximum = 0;

    }else if( T < 0){

        maximum = INT_MIN;

    } else if(T >= 0  &&  n > 0){

        for(int i = 0 ; i <= m[n-1] ; i++){

            ganancia = i*v[n-1] + F(n- 1,T- i*t[n-1]);

                if(ganancia > maximum){

                    maximum = ganancia;

                }
        }
    }

    almacen_rec[n-1][T] = maximum;
    return maximum;

}

目标是让变量almacen_rec(它先前初始化为-1)如下图所示:Memo table

我告诉你演习的一般功能: General function

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

下面我标记了使用// *在代码中实现memoization所需的更改。我假设代码是用C ++编写的,因此我可以使用标准库中的std::pairstd::map

std::map<std::pair<int, int>, int> table; // * (A global variable)

int F(int n , int T ){

    // See if we've already computed this value 
    std::pair<int, int> pair(n, T); // *
    if (table.find(pair) != table.end()) { // *
        return table[pair]; // *
    } // *

    int ganancia ;
    int maximum = INT_MIN;



    if( T >= 0  &&  n == 0){

        maximum = 0;

    }else if( T < 0){

        maximum = INT_MIN;

    } else if(T >= 0  &&  n > 0){

        for(int i = 0 ; i <= m[n-1] ; i++){

            ganancia = i*v[n-1] + F(n- 1,T- i*t[n-1]);

                if(ganancia > maximum){

                    maximum = ganancia;

                }
        }
    }
    // Store the value so we won't have to compute it again later if needed
    table[pair] = maximum; // *
    return maximum;
}