// Recursive
int maxProfit(vector<int> &values, vector<int> &weights, int n, int w){
int length = values.size();
if(w==0 || n==0){
return 0;
}
if(w<weights[length-n]){
return maxProfit(values,weights,n-1,w);
}
int a = maxProfit(values,weights,n-1,w-weights[length-n])+values[length-n];
int b = maxProfit(values,weights,n-1,w);
return max(a,b);
}
// Memoization
int helper(vector<int> &values, vector<int> &weights, int n, int w,vector<vector<int>> &dp){
int length = values.size();
if(w==0 || n==0){
return 0;
}
if(dp[w][n] != -1){
return dp[w][n];
}
if(w<weights[length-n]){
return helper(values,weights,n-1,w,dp);
}
int a = helper(values,weights,n-1,w-weights[length-n],dp)+values[length-n];
int b = helper(values,weights,n-1,w,dp);
dp[w][n] = max(a,b);
return dp[w][n];
}
int maxProfit(vector<int> &values, vector<int> &weights, int n, int w){
vector<vector<int>dp(w+1,vector<int>(n+1,-1));
return helper(values,weights,n,w,dp);
}
// dynamic programming:
int maxProfit(vector<int> &values, vector<int> &weights, int n, int w){
// Write your code here
vector<vector<int>> dp(w+1,vector<int>(n+1,0));
for(int i = 1; i<=w; i++){
for(int j = 1; j<=n; j++){
if(i<weights[n-j]){
dp[i][j] = dp[i][j-1];
}else{
dp[i][j] = max(dp[i-weights[n-j]][j-1]+values[n-j], dp[i][j-1]);
}
}
}
return dp[w][n];
}