按比例减少列表中的值以满足目标总和

时间:2015-02-13 02:10:15

标签: python algorithm list

考虑一个整数值列表

[30, 50, 100, 50, 30]

他们的总和是260.需要一个新的“目标”总和,例如200.如果按比例减少清单中的数值以获得新的金额,会有什么好办法?值应保持整数。

显然,可以通过目标总和 - 200/260 = 0.77(大约)的比率来减少它们,并将结果转换为整数:

[23, 38, 77, 38, 23]

新款:199。几乎就在那里!也许,减少随机元素的差异?

我希望这是对问题的充分解释。但是,目前的做法对我来说似乎有点不完美。还有其他建议吗?

3 个答案:

答案 0 :(得分:2)

您可能需要查看“点后面的值”,即整数除法的余数:

在你的例子中:

完全成比例的值(每个元素乘以200/260):

[23.076923076923077,38.46153846153846,76.92307692307692,38.46153846153846,23.076923076923077]

余数:

[0.07692307692307665,0.4615384615384599,0.9230769230769198,0.4615384615384599,0.07692307692307665]

如果您只是剪切余数(即向下舍入为int),则剩下2个单位进行分配,分配给具有最大余数的2个数字。这里是76和38的一个(你需要打破他们之间的联系,这有点不优雅)。

所以最终的解决方案是:

[23,39,77,38,23]

这旨在最小化最终整数值与“完美分割”值之间的差异。

在遗传算法中使用类似的技巧,它被称为“剩余随机抽样”,剩余的值随机分布,概率与余数成比例。

答案 1 :(得分:0)

说你的指数因子是p。你想解决:

2 * 30p + 2 * 50p ^ 2 + 100p ^ 3 = 200

我会让你解决p。

编辑:如果你想让降低成比例,解决这个问题:

2 * p + 2 * p ^ 2 + p ^ 3 = 260 -200 = 60

答案 2 :(得分:0)

建立RafałFowgird

sum_1 = [20, 30, 80, 90, 100]

a = float(sum(sum_1))

b = float(Desired Sum)

total = 0

for i in range(0, len(sum_2)):
    total += sum_1[i] * (b/a)

print total