Return the number of unique ways you can climb the staircase
Dynamic programming approach

My main advice is to prefer bottom-up iteration to top-down memoization. These are the two main approaches to dynamic programming as described on Wikipedia. Now, while there is nothing absolutely wrong with top-down approaches, bottom-up is, at least for this problem


cleaner to code
does not take up space on the stack
runs faster if method calls are slower than iteration


Finally, your code may re-compute the same values multiple times. This is not true of all top-down approaches, but is easy to avoid using bottom-up dynamic programming.

Bugs


incorrect if X is not sorted
incorrect if X does not contain 1 due to unnecessary memory[1] = 1


Minor style points


use more descriptive class and variable names
instead of N - X[i] &gt;= 0 use N &gt;= X[i]
prefer enhanced for loops


static int solution(int totalStairs, int[] stepSizeOptions) {
    int[] numberWays = new int[totalStairs+1];
    numberWays[0] = 1;

    for (int numStairs = 1; numStairs &lt;= totalStairs; numStairs++) {
        for (int stepSize : stepSizeOptions) {
            if (numStairs &gt;= stepSize) {
                numberWays[numStairs] += numberWays[numStairs - stepSize];
            }
        }
    }

    return numberWays[totalStairs];
}