繁体   English   中英

我的自上而下的背包 dp 方法有什么问题?

[英]Whats wrong with my top down knapsack dp approach?

我无法弄清楚我的自上而下的背包 dp 方法有什么问题,它在下面的链接上失败的测试用例需要帮助。

问题链接: https://www.interviewbit.com/problems/0-1-knapsack/

这是我的代码:

  int fin(int i,int wt,int curprofit,vector<int>&A,vector<int>&B,int C,int n,vector<vector<int>>&dp)
    {
        if(i==n)
            return curprofit;
        if(dp[i][wt]!=-1)
        return dp[i][wt];
        int ret=0;
        ret=max(ret,fin(i+1,wt,curprofit,A,B,C,n,dp));
        if(wt+B[i]<=C)
        {
            ret=max(ret,fin(i+1,wt+B[i],curprofit+A[i],A,B,C,n,dp));
        }
        return dp[i][wt]= ret;
    }
    int Solution::solve(vector<int> &A, vector<int> &B, int C) {
        int n=A.size();
        vector<vector<int>>dp(n+1,vector<int>(C+1,-1));
        return fin(0,0,0,A,B,C,n,dp);
    }

这是解决方法,但我建议您复习一下递归知识。

即时计算最大利润,而不是作为参数传递。 否则,您还需要将curprofit放入 dp state 中,这将是昂贵的。 您还可以通过删除 dp[][] 缓存来查看 output。 只需提出一个正确的递归解决方案并记住它。

int fin(int i,int wt,vector<int>&A,vector<int>&B,int C,int n,vector<vector<int>>&dp)
    {
        if(i==n)
            return 0;
        if(dp[i][wt]!=-1)
        return dp[i][wt];
        int ret=0;
        ret=max(ret,fin(i+1,wt,A,B,C,n,dp));
        if(wt+B[i]<=C)
        {
            ret=max(ret,fin(i+1,wt+B[i],A,B,C,n,dp) + A[i]);
        }
        return dp[i][wt]= ret;
    }
    int Solution::solve(vector<int> &A, vector<int> &B, int C) {
        int n=A.size();
        vector<vector<int>>dp(n+1,vector<int>(C+1,-1));
        return fin(0,0,A,B,C,n,dp);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM