python - 通过重复减去某些数字来最小化整数
问题描述
我正在尝试用 Python 编写一个程序,该程序接受一个正整数和一个来自用户的正整数列表。然后它应该重复从单个整数中减去列表中的整数,直到没有减法选项留下(单个整数的最终版本应该是正数或零)。最后,它应该返回单个整数末尾的最小值。
例如 -> 16 & [2, 5, 7, 20] -> 返回 0(从 16 中减去 8 乘以 2 或 2 乘以 5 和 3 乘以 2)& 20 & [14, 16, 21] -> 返回 4 (从 20 中减去 16)
没有与所采取的步骤数或我们使用列表中某个元素的时间相关的限制。
我尝试用 scipy.optimize.minimize 和递归编写它,都失败了。
目前,我正在寻找没有库导入的解决方案。
提前感谢您的回答
解决方案
这是硬币找零问题的一个变体,并且有一个解决方案与该问题的标准解决方案相同。这是一个动态规划问题,它存储从 0 到目标数字的每个值可实现的最小总数,更新每个可以减去的值(硬币)的结果。
它在 O(nm) 中运行,其中 n 是目标数,m 是包含可以减去的值的列表的长度。
def minsub(t, xs):
n = list(range(t+1))
for x in xs:
for i in range(x, t + 1):
n[i] = min(n[i], n[i - x])
return n[t]
下面是一些简单的测试:
tests = [
(16, [2, 5, 7, 20], 0),
(20, [14, 16, 21], 4)
]
for t, xs, want in tests:
got = minsub(t, xs)
print(t, xs, got, want)
assert got == want
推荐阅读
- javascript - 事件处理匿名方法中的javascript分配
- c++ - 在 C++ 中前向声明模板变量
- django - 无需迭代即可通过关系查询 Django 多对多?
- javascript - 如何通过使用lodash提取键值将数组转换为不同的数组
- c# - 从由 DataTable 填充的列表中删除字符(OleDB 读取 Excel 文件)
- swift - iOS datatask 命令行消息
- .htaccess - 使用 .htaccess 将根目录重定向到两个不同的目录
- flutter - 选择的图像不会在应用程序的发布版本中呈现
- typo3 - Fluid 中是否有已弃用的 Viewhelper 列表?
- python - 使用 ortools 的 OnSolutionCallback 出错