Here's a short C# DP solution, O(n^2):

IEnumerable<int> GetDenominations(int[] a) {
int[] ways = new int[a.Length]; ways[0] = 1;
for (int i=1; i<a.Length; i++) {
if (a[i]-ways[i]==1) { // i is a denominator
yield return i;
for (int j=0; j+i<ways.Length; j++) {
if (ways[j]>0)
ways[j+i] += ways[j]; // increment solutions
}
}
}
}

Note incrementing solutions by the # of previous solutions reachable by the next denomination for each new denomination discovered, instead of just by 1 as in @CodingPill's solution #2, which will incorrectly solve larger inputs.

A test case that shows this is:

[1,0,1,0,1,1,1,2,1,2,2,2,3,2,4,3] -> [2,5,7]

@meaty's solution correctly solves this input as well but is O(n^3) due to re-running through all discovered denominations in each round instead of memoizing the previous work.