π One-stop destination for all your technical interview Preparation π
int f(vector<int>& wt, vector<int>& val, int mw, int i)
{
if (i == 0) {
if (wt[0] <= mw) return val[0];
return 0;
}
int notTake = f(wt, val, mw, i - 1, dp);
int take = INT_MIN;
if (wt[i] <= mw)
take = val[i] + f(wt, val, mw - wt[i], i - 1, dp);
return max(take, notTake);
}
int knapsack(vector<int> weight, vector<int> value, int n, int maxWeight)
{
return f(weight, value, maxWeight, n - 1);
}
int f(vector<int>& wt, vector<int>& val, int mw, int i, vector<vector<int>>& dp)
{
if (i == 0) {
if (wt[0] <= mw) return val[0];
return 0;
}
if (dp[i][mw] != -1) return dp[i][mw];
int notTake = f(wt, val, mw, i - 1, dp);
int take = INT_MIN;
if (wt[i] <= mw)
take = val[i] + f(wt, val, mw - wt[i], i - 1, dp);
return dp[i][mw] = max(take, notTake);
}
int knapsack(vector<int> weight, vector<int> value, int n, int maxWeight)
{
vector<vector<int>> dp(n, vector<int>(maxWeight + 1, -1));
return f(weight, value, maxWeight, n - 1, dp);
}
int knapsack(vector<int> wt, vector<int> val, int n, int mw)
{
vector<vector<int>> dp(n, vector<int>(mw + 1, 0));
for (int W = wt[0]; W <= mw; W++)
dp[0][W] = val[0];
for (int i = 1; i < n; i++) {
for (int W = 0; W <= mw; W++) {
int notTake = dp[i - 1][W];
int take = INT_MIN;
if (wt[i] <= W)
take = val[i] + dp[i - 1][W - wt[i]];
dp[i][W] = max(take, notTake);
}
}
return dp[n - 1][mw];
}
prev = dp[i - 1]
curr = dp[i]
int knapsack(vector<int> wt, vector<int> val, int n, int mw)
{
vector<int> prev(mw + 1, 0), curr(mw + 1, 0);
for (int W = wt[0]; W <= mw; W++)
prev[W] = val[0];
for (int i = 1; i < n; i++) {
for (int W = 0; W <= mw; W++) {
int notTake = prev[W];
int take = INT_MIN;
if (wt[i] <= W)
take = val[i] + prev[W - wt[i]];
curr[W] = max(take, notTake);
}
prev = curr;
}
return prev[mw];
}
int knapsack(vector<int> wt, vector<int> val, int n, int mw)
{
vector<int> prev(mw + 1, 0);
for (int i = wt[0]; i <= mw; i++)
prev[i] = val[0];
for (int i = 1; i < n; i++) {
for (int W = mw; W >= 0; W--) { // Notice - loop reversed [mw->0]
int notTake = prev[W];
int take = INT_MIN;
if (wt[i] <= W)
take = val[i] + prev[W - wt[i]];
prev[W] = max(take, notTake);
}
}
return prev[mw];
}