imo using 2 arrays is a more straight forward solution:
static int solveKnapsack(int[] profits, int[] weights, int capacity) {
int[] dp = new int[capacity+1];
for(int i = 0; i<=capacity; i++)
{
if(weights[0] <= i)
{
dp[i] = profits[0];
}
}
for(int item = 1; item<weights.length; item++)
{
int[] temp = new int[capacity+1];
for(int w = 0; w<=capacity; w++)
{
if(weights[item] <= w) {
temp[w] = Math.max(dp[w], profits[item] + dp[w-weights[item]]);
} else {
temp[w] = dp[w];
}
}
dp = temp;
}
return dp[capacity];
}