【问题标题】:Algorithm: Buying a collection of goods with vouchers算法:用代金券购买商品集合
【发布时间】:2017-01-15 16:56:27
【问题描述】:

我正在努力为算法课程想出一个解决这个问题的方法:

你去商店想买n = {n1, n2, ..., nn} 商品,商品可以不同也可以不同。

该商店有以下促销活动:“如果客户购买了两件商品,其价格加起来以 11 美分、33 美分或 55 美分结尾,他将收到一张价值相应美分的代金券。”

问题是要提出一种算法来计算购买给定商品集合的最优策略,其中希望总成本最小化。

例如: 如果您需要购买价格为(1.01$、2.10$ 和 3$)的 3 种产品(n1、n2、n3) ,您应该一起购买 n1 和 n2,然后分别购买 n3,总成本为: (1.01 + 2.10) + 3 - (0.11) = 6 美元。

没有给出任何提示,但我认为我可以使用一些流网络方法。

【问题讨论】:

  • 那么这门课程是否暗示了问题的复杂性(P vs. NP-hard)?
  • 不,仅此而已。 ://

标签: algorithm data-structures computer-science complexity-theory network-flow


【解决方案1】:

按美分价格对您要购买的商品进行排序...即(25.01 美元、1.02 美元、...、0.99 美元)。

然后检查...是否有任何美分的总和为 0.99 美元... 这可以通过两个和问题轻松解决...您取 0.01 美元并使用二分搜索寻找它的补码 0.98 美元...删除这对并重复,直到您找不到总和为 0.99 美元的美分产品对.

如果这样做,删除找到的产品对...计算您的收益并检查是否有任何美分总和为 0.88 美元...以同样的方式。

...

如果这样做了,删除找到的产品对...并检查是否有任何美分总和为 0.11 美元...以相同的方式。

这都是O(nlogn) 的复杂性;)

【讨论】:

  • 您的解决方案没有考虑多种组合。如果您的价格为 1.05、2.06、0.05、0.01,则 1.05+2.06 和 0.05+2.06 都可以接受,但第二个更便宜。因此,如果您需要购买三件物品,您可以花费 0.05+2.06+0.01 而不是 1.05+2.06+0.01。另外,如何使二进制搜索对总和起作用?您事先并不知道您要寻找的价值。
  • “购买给定商品集合的最佳策略”...所以物品是给定的...例如我们想购买 3 件价格为 1.05、2.06、0.05... 的商品,我们总是节省 0.11 美元。在这种情况下,我们采取哪一对并没有什么区别;)
  • 我们想购买给定的商品集合...所以,比如说产品 A、B、C。不是给定数量的商品...如何使二进制搜索对总和起作用?如果我正在寻找两个加起来为 n 的整数...我从表中取出第一个...比如说 a 并使用二分搜索查找 (n-a) 以便 a + (n-a) = n。
  • 再次:请完整阅读。如果你进行二分搜索,你会找到第一个匹配的,你有可能会错过最佳的。如果二进制搜索中的第一个“中间”总和为 0.11,您将不会检查是否有一个仍然总和为 0.11 但更便宜,甚至更糟,总和为 0.33 或 0.55,因为然后您删除他们从列表中。例如。 2.04 可以与 0.07、0.29、0.51、1.07、1.29、1.51 等组合。
  • 但我一开始会检查任何 0.99 ......然后全部找到。只有这样我才会寻找 0.88 等等。
猜你喜欢
  • 2015-12-09
  • 1970-01-01
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 2012-10-18
  • 1970-01-01
相关资源
最近更新 更多