证明贪心算法

时间:2013-01-14 10:42:17

标签: algorithm greedy proof

我最近尝试解决Codeforces上的一个问题我确实得到了正确的解决方案但我现在正试图证明它。算法是这样的:

以最小的折扣并将其应用于最昂贵的折扣,并免费获得两个较便宜的折扣。然后继续做,直到没有物品离开。

我有点坚持证据。如果有人可以通过矛盾给我一个正式的证据,那将是很好的。

Problem

1 个答案:

答案 0 :(得分:1)

它分为两部分:

选择哪个折扣?

假设我们选择接受任何其他折扣(m件免费2件)而不是最小件(n件,n<m):将文章a(1)购买到{ {1}}我们免费获得文章a(m)b。我们可以采取最小的折扣,购买文章ca(1)以免费获取a(n)b,并将商品c购买至{{ 1}}以全价结束同样的情况。因此,选择最小的折扣是最差的,与其他选择相同。

要挑选哪些免费文章?

现在假设我们将折扣应用于商品a(n+1)a(m)而不是最贵的商品a1a2b1或{{1} })。我们假设b2因为案例是对称的。出现了三种情况:

  1. 不知怎的,我们仍然设法免费获得cost(a1)<cost(b1)作为促销的一部分:如果我们还没有选择,我们也可以获得cost(a2)<cost(b2)
  2. 作为折扣的一部分,我们必须付钱。折扣允许我们购买价格高达cost(a1)<cost(a2)的商品。出现以下情况之一:
    • a2:我们可以交换a1c,这样可以降低此购物篮的成本,而无需更改任何其他内容。
    • c<=cost(a1):让我们打电话给a1a2我们从第二次折扣中获得的项目,cost(a2)<=c<cost(a1)是最贵的。我们可以在第一个折扣中选择d作为免费项目,在第二个折扣中将其替换为e,并在第二个折扣中选择d作为免费项目,从而导致较低或等费用。
  3. 我们是通过折扣购买的:我们可以选择a2并以较低的费用支付d,而不会更改任何其他内容,因此挑选a1不是最理想的。