algorithm - 贪心算法的证明

标签 algorithm greedy proof

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

取最小的折扣并应用在最贵的上,并免费使用连续两个较便宜的。然后不断重复,直到没有剩余元素为止。

我有点卡在证明上了。如果有人能给我一个正式的反证法就好了。

Problem !

最佳答案

分为两部分:

选择哪个折扣?

假设我们选择除最小折扣(m 件,n )之外的任何其他折扣(n<m 件免费 2 件):购买商品 a(1)a(m)我们得到文章bc免费。我们可以拿最小的折扣,买文章a(1)a(n)得到bc免费,购买元素a(n+1)a(m)全价以同样的情况结束。因此,选择最小折扣最多只能与其他选择相提并论。

挑选哪些免费文章?

现在假设我们将折扣应用于商品 a1a2而不是最昂贵的b1一个b2 ( cost(a1)<cost(b1)cost(a2)<cost(b2) )。让我们假设 cost(a1)<cost(a2)因为案例是对称的。出现三种情况:

  1. 不知何故我们仍然设法得到 a2免费作为促销的一部分:那么我们也可以获得 a1如果我们还没有选择它的话。
  2. 作为折扣的一部分,我们必须为此付费。折扣使我们能够购买成本高达 c 的商品.出现以下情况之一:
    • c<=cost(a1) : 我们可以交换 a1a2 ,这会导致此篮子的成本降低,而无需更改任何其他内容。
    • cost(a2)<=c<cost(a1) :让我们调用de我们从第二次折扣中得到的元素,d是最贵的。我们本可以选择 a2作为第一次折扣中的免费项目,将其替换为d在第二个和采摘a1作为第二次折扣中的免费项目,导致成本更低或相同。
  3. 我们以折扣价购买它:我们可以选择 a2并支付了a1为了在不改变任何其他东西的情况下降低成本,因此选择 a1是次优的。

关于algorithm - 贪心算法的证明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14316898/

相关文章:

proof - 代码应该简短/简洁吗?

解决代数问题的算法?

algorithm - 动态规划总非统一模式识别

algorithm - 字符串的非重复字符

algorithm - 工作排序贪婪解决方案的最优性证明

haskell - 我如何证明 elem z (xs++ ys) == elem z xs ||元素z ys?

c - 使用 qsort 函数以交替方式对整数数组进行排序。

regex - Perl 给定字符串中正则表达式的所有匹配项

Java查看队列中的元素

math - 同一个图的两个最小生成树可以有不同的边权重吗?