Here's a hint to get you started. Apply standard dynamic programming algorithms for enumerating the set of partitions of an integer, and add some logic to check which of those allows for unique change-making by iteratively checking all sums, making change, and verifying uniqueness.
In a bit more detail: Suppose you have a multiset SS. Given a number ii with 1≤i≤n1≤i≤n, how could you identify a submultiset of SS that sums to ii? How could you check whether that submultiset is unique? Try to adapt standard dynamic programming techniques for making change. (See also this question.)
Given a multiset SS, how could you check whether it satisfies the second condition, i.e., whether every number from 1 to nn can be uniquely expressed as a sum of a submultiset of SS (the unique change-making condition)? This should be pretty easy, if you solved the previous one.
let P(n)P(n) denote the list of multisets that satisfy both of your conditions. If you knew P(1),P(2),…,P(n)P(1),P(2),…,P(n), how could you use that information to construct P(n+1)P(n+1)? Here you might want to adapt standard dynamic programming techniques for enumerating the partitions of an integer.
Here's an approach that will probably be better.
Suppose SS is a multiset that satisfies both of your conditions (for nn). How can we extend it to get a multiset TT that has one element more? In other words, how can we identify all the ways to add one more element to SS, to get a new multiset TT that satisfies both of your conditions (for some n′n′)?
Answer: if xx can be expressed as a sum of some of the elements of SS, then there's no point in adding it to SS: that would cause TT to violate the uniqueness condition. So, we can enumerate all integers xx that cannot be expressed as a sum of some of the elements of SS; each one is something that could potentially be added to SS to get a new multiset TT that will satisfy both conditions (for some other nn).
Moreover, it is possible to enumerate which integers can be expressed as a sum of some of the elements of SS, and which cannot, using dynamic programming. You build a two-dimensional array A[1…|S|,1…n]A[1…|S|,1…n] of booleans, where A[i,j]A[i,j] is true if there is a way to express the integer jj as a sum of some of the first i elements of S (only the first i elements of S are eligible to be used; where S has been sorted, so S={s1,s2,…,sk} and s1≤s2≤⋯≤sk). Note that A[i,j] can be computing using the values of A[1…i−1,1…j−1]: in particular, A[i,j]=A[i−1,j]∨A[i−1,j−si] if j>si, or A[i,j]=A[i−1,j] otherwise. This enables us to identify all numbers that are candidates to be added to S.
Next, for each candidate extension T of S (obtained by adding one element to S), we want to check whether T satisfies both conditions. Let n denote the sum of elements of S, and n′ the sum of elements of T. We need to check whether every integer in the range n+1,n+2,…,n′ can be expressed as a sum of some of the elements of T. This too can be solved using dynamic programming, using standard algorithms for change-making. (In fact, if you still have the array A mentioned above you can easily extend it a little bit to solve this problem: we make it an array A[1…|T|,1…n′], continue to fill in all of the additional entries, and make sure that A[|T|,n+1],A[|T|,n+2],…,A[|T|,n′] are all true.) So, now we can enumerate all multisets T that extend S by a single element and that satisfy both conditions.
This immediately suggests an algorithm to enumerate all multisets S that satisfy your condition, for all n up to some bound, say n≤20. We'll have an array P[1…20], where P[5] stores all multisets S that sum to 5, and generally, P[n] stores the set of all multisets S that sum to n.
Next, we can fill in P[n] iteratively. Start by setting P[1] to contain just the one multiset {1}. Next, for each n (counting up from 1 to 20), for each S∈P[n], enumerate all possible extensions T of S (using the techniques above), let n′ denote the sum of the elements of T, and insert T into P[n′] if it isn't already present and if n′≤20.
This should be pretty doable. Good luck! Have fun! Working through the details will be a good learning-exercise in dynamic programming.