找到解决方案后退出递归调用树

时间:2018-08-26 16:12:52

标签: python algorithm

我有这个问题,给定一组数字S和一个数字N,找到一些数字S的组合,这些数字的总和等于N,这样该解决方案便使用了最小数量的数字。即最小化|解决方案|

例如,假设S = {1000,500,250,100},而A = 900,则解决方案= {500,100,100,100,100}

这是我的尝试

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, [])

它有效!某种程度上,我得到正确的答案,并且它始终是我打印的第一个值(因为我确保数字集按降序排列)。但是该算法会继续打印所有其他正确答案(此处正确是指总和而不是最小化| Solution |)

  

[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 个答案:

答案 0 :(得分:3)

由于您没有使用返回值:

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, [])