【问题标题】:How to do this recursive code without memo, with memoization?如何在没有备忘录的情况下使用备忘录来执行此递归代码?
【发布时间】:2016-03-29 15:10:18
【问题描述】:

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

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)像这张图:

我给你留下练习的一般功能:

感谢您的帮助!

【问题讨论】:

  • 返回 almacen_rec[n][T];看起来不对:n-1?
  • 哦,是的!但仍然是返回错误的表。我的程序返回一个备忘录表而不更改任何内容,所有空格都带有 -1。谢谢!
  • 比以前说得好,我的程序返回除解空间外的所有空格,这是正确的。所以我的问题是记忆的子问题,没有解决。
  • 欢迎来到Stack Overflow。如果您有其他信息来澄清您的问题,请直接将信息添加到您的问题中。 cmets 不适合这个。

标签: c++ recursion memoization


【解决方案1】:

在下面,我用// * 标记了在您的代码中实现记忆所需的更改。我假设代码是 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;
}

【讨论】:

    猜你喜欢
    • 2015-03-18
    • 2013-08-30
    • 1970-01-01
    • 2023-01-17
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    相关资源
    最近更新 更多