#include <iostream>
#include <vector>
using namespace std;
int solve(vector<int> &values, vector<int> &weights, int index, int capacity, vector<vector<int> >& dp)
{
if(index == 0)
{
if(weights[0] <= capacity)
{
return values[0];
}
else
{
return 0;
}
}
if(dp[index][capacity] != -1)
{
return dp[index][capacity];
}
int include = 0;
if(weights[index] <= capacity)
include = values[index] + solve(values, weights, index - 1, capacity - weights[index], dp);
int exclude = 0 + solve(values, weights, index - 1, capacity, dp);
dp[index][capacity] = max(include, exclude);
return dp[index][capacity];
}
int maxProfit(vector<int> &values, vector<int> &weights, int n, int w)
{
vector<vector<int>> dp(n, vector<int>(w + 1, -1));
return solve(values, weights, n - 1, w, dp);
}
int main() {
vector<int> values = {60, 100, 120};
vector<int> weights = {10, 20, 30};
int n = values.size();
int W = 50;
cout << "Maximum Profit: " << maxProfit(values, weights, n, W) << endl;
return 0;
}