python - 找到解决方案时退出递归调用树
问题描述
我有这个问题,给定一组数字 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]
等等
当我找到第一个答案时,我怎么能退出这个算法?
解决方案
由于您没有使用返回值:
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, [])
推荐阅读
- javascript - setState 仅在使用对象作为状态时设置最后一个输入
- python - 在 Windows 上使用 Anaconda 使用 mpio 配置 H5py
- spectron - Spectron 中 app.client.setValue 的任何解决方法?
- java - Android Studio上的ToDo List-无法解决方法
- pyspark - ImportError:无法导入名称“SparkContext”
- selenium - 如果我们可以一次设置隐式等待更多的时间,那么显式等待需要什么?
- python-3.x - 如何在 Python 中为 scipy 信号卷积添加比率参数?
- rabbitmq - 路由键不匹配
- selenium - 安静地忽略屏幕阅读器文本
- swift - 无法让 Youtube iframe 在 iOS11 和 iOS10 上运行