我试图使用数字子集的倍数计算该总和的已知总和或最接近的值。在这种方法中,我想最小化倍数或系数。
例如,如果我有号码120
并且我有一组50s
和20s
,我会得到
120 = 2*50 + 1*20.
但是,这组数字可能有限,所以如果我只有1x50
和6x20s
,我会得到
120 = 6*20.
此外,如果我只有5x20s
,因为我想最小化系数,我会
110 = 1*50 + 3*20.
请注意,在这种情况下,该值是与总和最接近的值。如果可以实现总和,则优先于具有较少倍数的总和的最接近的值。
是否有已知的算法来实现此结果?
答案 0 :(得分:0)
您寻求的算法通常被称为“贪婪”。算法。您可以在这里阅读理论及其工作原理:Cut optimisation algorithm
与您的特定请求类似的常见用例是制造中使用的剪切长度优化。查看这篇讨论该问题的维基百科文章,以及所需优化算法背后的微积分:https://en.m.wikipedia.org/wiki/Cutting_stock_problem
有关此操作的示例,请使用脚本算法作为宏来试用此电子表格:http://www.cutoptimizer.com