这是一个组合问题,可以使用递归的方法解决。
首先,我们需要确定递归函数的参数和返回值。由于题目要求每个题目金额都要用到,因此我们需要记录当前已经选取的金额总数和每种金额的数量。同时,我们需要返回所有可能的选取方案。
接下来,我们考虑如何实现递归函数。我们可以从剩余的金额中选择一个数,然后将该数的数量加入对应的计数器中,并更新当前已经选取的金额总数。然后,我们对剩余的金额进行递归调用,直到金额总数达到题目要求或者剩余金额不足以满足要求为止。如果金额总数达到题目要求,则将当前的计数器作为一种选取方案返回。
最后,我们需要处理重复的选取方案。由于每种金额的数量是有限的,因此同样的选取方案可能会被多次生成。为了避免重复,我们可以在递归函数中记录已经选取的金额,然后在选择下一个金额时跳过已经选取过的金额。
以下是具体的实现代码:
```python
def combination_sum(amounts, target):
def dfs(remain, counters, total):
if total == target:
return [counters]
if total > target or not remain:
return []
res = []
for i, amount in enumerate(remain):
if amount <= target - total:
new_counters = counters[:]
new_counters[i] += 1
new_total = total + amount
res += dfs(remain[i:],