int f(int ind,int wt, int w[],int v[],vector<vector<int>>& dp)
{
if(ind==0)
{
return (w[0]<=wt)?v[0]:0;
}
int pick,nonpick;
if(dp[ind][wt]!=-1)
return dp[ind][wt];
nonpick = f(ind-1,wt,w,v,dp);
pick = INT_MIN;
if(wt>=w[ind])
pick = v[ind] + f(ind-1,wt-w[ind],w,v,dp);
return dp[ind][wt] = max(pick,nonpick);
}
int knapSack(int W, int wt[], int val[], int n)
{
// Your code here
vector<vector<int>> dp(n + 1, vector<int>(W + 1, -1));
return f(n-1,W,wt,val,dp);
}