01 Knapsack (recursive and iterative)

Posted By Swaroop on Wednesday, 2 March 2022

static int[][] dp;
    static int knapSack(int W, int wt[], int val[], int n)
    {
         dp = new int[n+1][W+1];
         for(int[] i : dp){
             Arrays.fill(i,-1);
         }
         return helper(W,wt,val,n);
    }
    static int helper(int W,int[] wt,int[] val,int n){
        if(n==0 || W==0){
             return dp[n][W] = 0;
         }
         if(dp[n][W] != -1){
             return dp[n][W];
         }
         if(wt[n-1] > W){
             return dp[n][W] = helper(W,wt,val,n-1);
         }
         return dp[n][W] =Math.max(val[n-1]+helper(W-wt[n-1],wt,val,n-1),helper(W,wt,val,n-1));
    }

//Iterative(Top-down)

static int knapSack(int W, int wt[], int val[], int n)
    {
         // your code here
         int[][] dp = new int[n+1][W+1];
         for(int i=1;i<n+1;i++){
             for(int j=1;j<W+1;j++){
                if(wt[i-1]>j){
                     dp[i][j] = dp[i-1][j];
                 }else{
                     dp[i][j] = Math.max(val[i-1] + dp[i-1][j-wt[i-1]] , dp[i-1][j]);
                 }
             }
         }
         return dp[n][W];
    }