What you are asking for is a SAT algorithm and it has an exponential complexity, therefore unless you have some extra constraints you must do an exhaustive check (brute force as you said).
You may be interested in the function itertools.combinations(iterable, combinations_length)
to sum all possible combinations. also you can represent your elements like this: {3:2, 7:1, 10:1}
=> [3, 3, 7, 10]
You can check this article https://en.wikipedia.org/wiki/Change-making_problem
for other options
solved Algorithm to decide if giving rest is possible