【发布时间】:2021-07-15 21:59:03
【问题描述】:
所以我要解决的问题是,我想在我拥有的集合中找到可能的数字组合,加起来为 400
我在第 1 组中有 6 个数字,可以是以下任意一个:[0, 6, 8, 12, 16, 30] 以及第 2 组中的另外 6 个数字,可以是以下任意一个:[0, 16, 20, 25, 32, 40, 50]
我认识到,由于我只关心总和,因此顺序应该无关紧要,但我不确定我将如何实际处理设置。一次更改 1 个数字,每次迭代的价值减少,然后一旦我的总数低于 400 打破该运行并移动到下一个数字,这是否有意义?例如: 如果我从 [30,30,30,30,30,30][50,50,50,50,50,50] 开始在最后一个索引中减少,一旦我达到 [30,30,30,30,30, 30][50,50,50,32,20,16] 其余的迭代集中在第 11 列(只有一个,当它等于 16 时)可以被忽略,因为它们只会减少。 还是有更合乎逻辑的方法来解决这个问题?
【问题讨论】:
-
这不是一个编程问题,尽管我很乐意回答。这可能属于数据科学或博弈论之类的东西,但不属于 python,即使你试图用 python 来做,因为你只是在问是否有更好的逻辑(或数学)方法来解决这个问题;不是如何在 python 中执行 X、Y 或 Z 方法,您尝试过但遇到错误。
-
这就是所谓的零一赋值问题,是整数规划的一个子集,是约束优化的一个子集。对这些术语进行网络搜索会找到一些资源。本质上,您希望找到 a1、a2、... + b1 n1 + b2 n2 + ... + b6 n6 = 400。GLPK 是可以解决此类问题的软件包。如果你想创建自己的实现,可能有相对简单的算法。您可以从蛮力开始(尝试所有 2^12 组合)。
-
@RobertDodier 的方法 O(n) 可能比我的 O(2n) 或 O(3n) 稍快(计算上),但无论如何这两者最终都被简化为 O(n),但如果你是手工做的,我会从逻辑上论证我建议的方式对人类来说比暴力破解“更容易”。
-
太棒了,感谢您的帮助!我会试试这些方法
标签: algorithm math combinations