C++ 如何在没有备忘录的情况下,通过备忘录实现递归代码?

C++ 如何在没有备忘录的情况下,通过备忘录实现递归代码?,c++,recursion,memoization,C++,Recursion,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 &

我知道什么是记忆,但有这样的递归代码:

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;
}
intf(intn,intt){
内加南西亚;
int最大值=int_最小值;
如果(T>=0&&n==0){
最大值=0;
}else如果(T<0){
最大值=整数最小值;
}else如果(T>=0&&n>0){
对于(int i=0;i最大值){
最大值=ganancia;
}
}
}
返回最大值;
}
我不知道如何转化成记忆。我做过这样的事情:

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;

}
intf_alm(intn,intt){
内加南西亚;
int最大值=int_最小值;
//佩塔波埃斯托酒店
如果(almacen_rec[n-1][T]!=-1){
返回almacen_rec[n-1][T];
}else如果(T>=0&&n==0){
最大值=0;
}else如果(T<0){
最大值=整数最小值;
}else如果(T>=0&&n>0){
对于(int i=0;i最大值){
最大值=ganancia;
}
}
}
almacen_rec[n-1][T]=最大值;
返回最大值;
}
目标是使变量almacen_rec(它以前都初始化为-1)如下图所示:

我给大家介绍一下练习的一般功能:


谢谢你的帮助

下面,我用
//*
标记了在代码中实现备忘录化所需的更改。我假设代码是C++的,所以我可以使用和从标准库。

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;
}
std::映射表;//*(一个全局变量)
int F(int n,int T){
//看看我们是否已经计算了这个值
std::对(n,T);//*
if(table.find(pair)!=table.end()){//*
返回表[对];//*
} // *
内加南西亚;
int最大值=int_最小值;
如果(T>=0&&n==0){
最大值=0;
}else如果(T<0){
最大值=整数最小值;
}else如果(T>=0&&n>0){
对于(int i=0;i最大值){
最大值=ganancia;
}
}
}
//存储该值,这样我们以后就不必在需要时再次计算它了
表[对]=最大值;//*
返回最大值;
}

下面,我用
/*
标记了在代码中实现记忆所需的更改。我假设代码是C++的,所以我可以使用和从标准库。

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;
}
std::映射表;//*(一个全局变量)
int F(int n,int T){
//看看我们是否已经计算了这个值
std::对(n,T);//*
if(table.find(pair)!=table.end()){//*
返回表[对];//*
} // *
内加南西亚;
int最大值=int_最小值;
如果(T>=0&&n==0){
最大值=0;
}else如果(T<0){
最大值=整数最小值;
}else如果(T>=0&&n>0){
对于(int i=0;i最大值){
最大值=ganancia;
}
}
}
//存储该值,这样我们以后就不必在需要时再次计算它了
表[对]=最大值;//*
返回最大值;
}

return almacen_rec[n][T];看起来不对:n-1?哦,是的!但仍然返回了错误的表。我的程序返回一个备注表,不做任何更改,所有空格都带-1。谢谢比以前更好的说法是,我的程序返回除解空间之外的所有带-1的空间,这是正确的。所以我的问题是关于备忘录的子问题,这些问题并没有解决。欢迎来到。如果您有其他信息来澄清您的问题,请将这些信息直接添加到您的问题中。评论不是这个地方。返回almacen_rec[n][T];看起来不对:n-1?哦,是的!但仍然返回了错误的表。我的程序返回一个备注表,不做任何更改,所有空格都带-1。谢谢比以前更好的说法是,我的程序返回除解空间之外的所有带-1的空间,这是正确的。所以我的问题是关于备忘录的子问题,这些问题并没有解决。欢迎来到。如果您有其他信息来澄清您的问题,请将这些信息直接添加到您的问题中。评论不是这个地方。