Actually combination Sum I,II, III are very similar. We only need to modify our solution a little bit to meet the requirements. My solution for Sum II is here.

```
def combinationSum3(self, k, n):
# We don't need to sort, because each number only can be used once,
# and all they are all positive.
result = []
self.combination_sum_3(k, 1, n, [], result)
return result
def combination_sum_3(self, length, start, target, path, result):
# In this problem, I give a property `length` to track the current length of
# our path. We decrease the length by 1 each recursive call. So in the base
# case here we only need to check whether the length is 0 (the real length
# of path is exactly 3).
# The design of `target` is still the same as Sum I and II.
if not target and not length:
result.append(path)
return
for i in xrange(start, 10):
# Avoid unnecessary searching, since all the numbers are positive.
if not length or i > target:
return
# We set `start` as `i + 1` because all candidates only could be
# used once, otherwise we set it as `i`.
self.combination_sum_3(length - 1, i + 1, target - i, path + [i], result)
```