Maximum subset sum with no adjacent elements
Many folks find that tacking on { } braces
to even a single-line if body is a useful way of preventing future bugs.

You wrote:

  array[0] + maxSubsetSumNoAdjacent(Arrays.copyOfRange(array, 2, array.length)),
  array[1] + maxSubsetSumNoAdjacent(Arrays.copyOfRange(array, 3, array.length))


The pair of copy statements is wasteful.
You're allocating temp storage (for GC to collect)
and consuming memory bandwidth.
It turns what could be a linear algorithm into a quadratic one (O(n) → O(n^2)).
The caller is going to simply hand you an array,
so you have to conform to that public API, accepting a single argument.
But nothing stops you from overloading, from writing a private helper.
Your public function should immediately ask the helper about the array,
from index 0 onward to end of array.
Then all the work happens in the helper.
Note that recursive calls that pass array plus a starting index
will never copy the array.
They merely pass a pointer to start of original array, in O(1) time,
independent of how enormous that array happens to be.
You have an opportunity to dramatically improve the implemented algorithm,
by passing index to the &quot;as yet unsolved&quot; portion of the array.