首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >算法临界点

问算法临界点
EN

Stack Overflow用户
提问于 2013-04-12 23:48:29
回答 2查看 263关注 0票数 0

我是一个完全的算法笨蛋,我有这个问题,我需要找到购买未知数量的小部件的最低成本,无论是按单价还是通过批量购买x个小部件……我相信一个例子会有所帮助的:

1) Widget单价为0.05美元2)批量Widget定价为每100个Widget 4.00美元

假设我想买140件小配件-

a)按单位计算成本为140 x $0.05c => $7.00 b)按批次计算成本为2批次100 @ $4.00 => $8.00 (超出的60个部件可忽略)

因此,在这种情况下,按单位购买要便宜1.00美元

但是,如果我想买190个小配件,那么-

a)按单位计算成本为190 x $0.05c => $9.50 b)按批次计算成本为2批次100 @ $4.00 => $8.00 (超出的10个部件可忽略)

在这种情况下,批量购买的价格更便宜。

因此,我需要找出如何通过编程找出两种方法之间的“引爆点”,以获得最便宜的价格。

我希望我已经解释好了,我相信这是一个简单的答案,但今天我的大脑很快就消失了!

提亚

编辑::

好的,对不起--我意识到我没有说得那么清楚--正如有人指出的那样,批次和单元的混合也是可能的,所以对于140小部件示例,也可以是1批次和40个单元。

我试图实现的是以编程方式找到最便宜的方式购买X个小工具,每个在$XX定价,也给出了一个批次价格$YY的NN小工具。

购买批次产生的任何多余小部件都没有问题,即可以购买X个以上的小部件,但不能少于X个

因此,对于140个示例,1批次@ $4.00 + 40个单位@ $0.05,=> $6.00,这是我认为最便宜的。对于190个例子来说,2批仍然是最便宜的,我认为1批+ 90个单位是8.50美元……

我希望有一些简洁的等式可以做到这一点:)

EN

回答 2

Stack Overflow用户

发布于 2013-04-12 23:55:16

这个问题的答案非常简单,如果你以另一种方式思考它的话。你已经知道价格的“临界点”了。是8.00美元。您不知道的是单位中的点,即$8.00除以$0.05 (每个单位) => 160单位。

请注意,也有机会购买100个单位@ $4.00和60个单位@0.05美元,结果是总共7.00美元。这是第三种可能性,你可能会也可能不会考虑。

编辑:编辑之后,事情变得更加简单:

您在$XX有1个项目,在$YY有一批NN项目。假设$YY/NN < $XX (意思是批处理实际上省钱),您所要做的就是:

  1. 将目标数量除以NN,然后向下舍入。你必须用$XX购买这个数量的batches
  2. Multiply,剩余的数量。如果超过$YY,只需额外购买一批,否则请在$XX

购买剩余数量

票数 1
EN

Stack Overflow用户

发布于 2013-04-13 00:22:54

我用python写了一个基本的暴力风格的脚本来比较两个选项的价格(最多1000个元素)。这不是最快也不是最优雅的方法,但它似乎是有效的。

输出的格式为:(<unit-count>, (<per-unit-cost>, <per-batch-cost>))

代码语言:javascript
复制
import math
import itertools
import pprint

unitList = range(1000)
pricePerUnit = .05
pricePerBatch = 4.0
numberPerBatch = 100.0

def calculatePerUnit(units):
  """ Calculate the price of buying per unit
  """
  return units * pricePerUnit

def calculatePerBatch(units):
  """ Calculate the price of buying per batch
  """
  return math.ceil(units / numberPerBatch) * pricePerBatch

def main():
  """ Execute the script
  """
  perUnit = map(calculatePerUnit, unitList)
  perBatch = map(calculatePerBatch, unitList)
  comparisonList = zip(perUnit, perBatch)
  perUnitCheaperPriceList = list(itertools.ifilter(lambda x: x[0] < x[1], comparisonList))
  perUnitCheaperUnitList = map(lambda x: int(x[0] / .05), perUnitCheaperPriceList)                                                                              
  pprint.pprint(zip(perUnitCheaperUnitList, perUnitCheaperPriceList))

if __name__=="__main__":
  main()

结果是:

代码语言:javascript
复制
[gizmo@test ~]$ python TippingPoint.py 
[(1, (0.050000000000000003, 4.0)),
 ... These are sequential values I left out for brevity ...
 (79, (3.9500000000000002, 4.0)),
 (101, (5.0500000000000007, 8.0)),
 ... These are sequential values I left out for brevity ...
 (159, (7.9500000000000002, 8.0)),
 (201, (10.050000000000001, 12.0)),
 ... These are sequential values I left out for brevity ...
 (239, (11.950000000000001, 12.0)),
 (301, (15.050000000000001, 16.0)),
 ... These are sequential values I left out for brevity ...
 (319, (15.950000000000001, 16.0))]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15975684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档