正如标题所说,从一组整数中找出一个子集,其总和最接近一个值。 其中约有1000个项目,价值约为1000万,我考虑过用DP(动态编程)来解决这个问题,就像“装箱问题”一样,但这个方法不合适,套装是太大,价值太大。
我该怎么办,尝试启发式算法?但是如何使用哪个?
答案 0 :(得分:0)
启发式算法:
订单设置最小到最大
查找小于所需值的最大值(二进制搜索)
从最小值开始,尝试在步骤1中找到的值。如果完全匹配,则完成。否则直到总和超过目标。保存这些值组合。
重复1.从1中的下一个较小值开始,以组成另一个总和。重复直到超出值
用尽时,选择总和衣柜到目标。
答案 1 :(得分:0)
我不知道它的效率如何,但您可以尝试MILP(混合整数线性规划)方法。
LP配方:
Variables: Xi = 1 if element No. i is selected.
Z1: Negative deviation from VALUE
Z2: Positive deviation from VALUE
Minimize Objective function:
Z1 + Z2 // Given the nature of problem, at most 1 among Z1 and Z2 shall be > 0.
Subject to constraint:
summation(WiXi) + Z1 - Z2 = VALUE
Xi = 0 or 1.
Z1, Z2 >= 0
您可以使用任何解算器包解决上述整数线性编程。