考虑一个整数值列表
[30, 50, 100, 50, 30]
他们的总和是260.需要一个新的“目标”总和,例如200.如果按比例减少清单中的数值以获得新的金额,会有什么好办法?值应保持整数。
显然,可以通过目标总和 - 200/260 = 0.77(大约)的比率来减少它们,并将结果转换为整数:
[23, 38, 77, 38, 23]
新款:199。几乎就在那里!也许,减少随机元素的差异?
我希望这是对问题的充分解释。但是,目前的做法对我来说似乎有点不完美。还有其他建议吗?
答案 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