【发布时间】:2019-06-29 17:17:57
【问题描述】:
所以我与一些同事交谈,我目前遇到的问题实际上非常具有挑战性。这个问题背后的背景与质谱和软件给出的不同峰的结构分配有关。
但是要分解成优化问题,我有一定的目标值。我还有一个各种输入的列表,我希望它们的总和尽可能接近目标。
举个例子,这就是我所拥有的。
List of inputs: [18.01, 42.01, 132.04, 162.05, 203.08, 176.03]
Target value: 1800.71
我想找出所有可能的输入组合,其总和在 1800.71 的 0.5 以内。所以总和可以在 1800.21 和 1801.21 之间的任何地方。
我已经知道两个输入可能是:
[18.01, 162.05, 162.05, 162.05, 162.05, 162.05, 162.05, 162.05, 162.05, 162.05, 162.05, 162.05] **which gives a sum of 1800.59**
和
[18.01, 18.01, 203.08, 203.08, 203.08, 162.05, 203.08, 18.01, 18.01, 18.01, 18.01, 18.01, 18.01, 18.01, 18.01, 18.01, 18.01, 42.01, 162.05, 203.08, 203.08] **which gives a sum 1800.71**
我不想找到让我尽可能接近目标值的组合;我对目标值 0.5 以内的所有可能组合感兴趣。
如果有人能帮我解决这个问题,我将不胜感激!
【问题讨论】:
-
听起来您正在寻找coin change problem的某种变体
-
查看
itertools的文档,尤其是combinations、permutations、product和chain -
数据集有多大?对于长度为 1 和 n 的快速而肮脏的排列将起作用,否则实现动态规划,如硬币找零问题所示。
-
@MatsLindh 数据集不大。我只有几个目标值,我想找到输入的组合。挑战在于我试图找到总和接近目标值的输入组合。
-
@Alan 问题是,您可以选择多少个数字。我觉得这个问题的复杂度等级相当高,它不会轻易超过 10-20 个数字。我认为 python 是解决这类问题的错误语言,因为它的速度非常慢。
标签: python python-3.x