我知道什么是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)如下图所示:
感谢您的帮助!
答案 0 :(得分:0)
下面我标记了使用// *
在代码中实现memoization所需的更改。我假设代码是用C ++编写的,因此我可以使用标准库中的std::pair和std::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;
}