簡體   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