微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

比较 DFS(recursive) + DP(memoization) vs General Recursion + DP (memoization)

如何解决比较 DFS(recursive) + DP(memoization) vs General Recursion + DP (memoization)

我一直在使用 DFS + memoization 类型的方法解决 DP 问题。到目前为止,它已经完美地解决了每一个问题。但是最近当我尝试解决 0/1 背包问题时,它在 geeksforgeeks 中给出了 TLE,但在 Leetcode 中运行良好。 一般方法是考虑当前元素或在数组中向前移动。 但是我使用的方法是,我在 for 循环 中明确提到它必须去的地方。例如,要么转到第二个或第三个或...或第 10 个元素。我已经分析了我的方法,对我来说似乎是这样。但我无法理解为什么它会给 TLE。

我提供 TLE 的方法代码是:

int dp[1001][1001];
int util(int indx,int cur_weight,int n,int weights[],int values[]){

if(dp[indx][cur_weight]!=-1)return dp[indx][cur_weight];
int mx_val=0;
for(int i=indx+1;i<n;i++){
    if(cur_weight-weights[i]>=0)
        mx_val=max(mx_val,util(i,cur_weight-weights[i],n,weights,values));
}
dp[indx][cur_weight]=mx_val+values[indx];
return dp[indx][cur_weight];
}

int knapSack(int W,int wt[],int val[],int n) 
{ 
memset(dp,-1,sizeof(dp));
int mx_val=0;
for(int i=0;i<n;i++){
    if(wt[i]<=W)
    mx_val=max(mx_val,W-wt[i],wt,val));
    dp[i][W]=mx_val;
}

return mx_val;
}

使用标准 DP 解决方案并且给 TLE 的另一个解决方案的代码是:

int dp[1001][1001];
int answer(int w,int n){
 if(n == 0 || w == 0)
    return 0;
 if(dp[n-1][w] != -1)
    return dp[n-1][w];

 if(wt[n-1] <= w){
    return dp[n-1][w] = max(val[n-1] + answer(w-wt[n-1],val,n-1),answer(w,n-1));
 }
   
return dp[n-1][w] = answer(w,n-1);

}

int knapSack(int W,int n) 
{ 
// Your code here
 memset(dp,sizeof(dp));
 return answer(W,n);
}

有人可以帮忙吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。