关于python:找到解决方案时退出递归调用树

Exiting a tree of recursive calls when a solution is found

我有一个问题,给定一组数字s和一个数字n,找到一些和为n的数字s的组合,这样解决方案就使用了最小数量的数字。IE最小化解决方案|

例如,假设S=1000、500、250、100和A=900,然后解决方案=500、100、100、100、100

这是我的尝试

1
2
3
4
5
6
7
8
9
10
11
12
numbers = [1000, 500, 250, 100]
amount = 900

def solve(numbers, amount, sum, solution):
    for num in numbers:
        if sum + num <= amount:
            if sum + num == amount:
                print(solution + [num])
                return
            solve(numbers, amount, sum + num, solution + [num])

solve(numbers, amount, 0, [])

而且它是有效的!某种程度上,我得到了正确的答案,它总是我打印的第一个值(因为我确保数字集是按降序排列的)。但是算法继续打印其他所有正确的答案(这里正确的意思是总和而不是最小化解决方案)

[500, 100, 100, 100, 100] [250, 250, 100, 100, 100, 100] [250, 100,
250, 100, 100, 100] [250, 100, 100, 250, 100, 100] [250, 100, 100,
100, 250, 100] [250, 100, 100, 100, 100, 250]

等等。

当我找到第一个答案时,如何退出此算法?


因为您没有使用返回值:

1
2
3
4
5
6
7
8
9
10
11
12
13
numbers = [1000, 500, 250, 100]
amount = 900
def solve(numbers, amount, sum, solution):
    for num in numbers:
        if sum + num <= amount:
            if sum + num == amount:
                print(solution + [num])
                return True
            if solve(numbers, amount, sum + num, solution + [num]):
                return True
     return False

solve(numbers, amount, 0, [])