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