注意:这是对现实生活中有关对SWF文件中的记录进行排序的问题的抽象措词。一个解决方案将帮助我改善开源应用程序。

鲍勃(Bob)有一间商店,并想进行销售。他的商店有许多产品,并且每种库存产品都有一定数量的单位数量。他还具有许多在架子上安装的价格标签(与产品数量一样多),并且已经在价格标签上打印了价格。他可以在任何产品上贴上任何价格标签(该产品的全部库存中某一产品的统一价格),但是某些产品还有其他限制-任何此类产品可能都不比某些其他产品便宜。

您必须找到如何安排价格标签的方法,以使鲍勃所有商品的总成本尽可能低。总成本是每个产品分配的价格标签的总和乘以该产品的库存数量。

鉴于:

  • N –产品数量和价格标签
  • Si,0≤i
  • Pj,0≤j
  • K –附加约束对的数量
  • Ak,Bk,0≤k
  • 任何产品索引最多只能在B中出现一次。因此,由该邻接表形成的图实际上是一组有向树。

  • 该程序必须找到:
  • Mi,0≤i
    满足条件:
  • PMAk≤PMBk,对于0≤k 0≤iΣ(Si×PMi)为最小


  • 请注意,如果不是针对第一个条件,则解决方案将是简单地按价格对标签进行分类,并按数量对产品进行分类,然后直接将二者匹配。

    输入的典型值为N,K
    这是为什么大多数简单的解决方案(包括拓 flutter 排序)不起作用的一个示例:

    您有10个项目,数量从1到10,有10个价格标签,价格从$ 1到$ 10。有一个条件:数量为10的商品一定不能比数量为1的商品便宜。

    最佳解决方案是:
    Price, $   1  2  3  4  5  6  7  8  9 10
    Qty        9  8  7  6  1 10  5  4  3  2
    

    总费用为249美元。如果将1,10对放置在任一极端附近,则总成本会更高。

    最佳答案

    对于一般情况,问题是NP完全的。这可以通过减少3分区来显示(这是仍然很强的NP完整版装箱)。

    令w1,...,wn为3分区实例的对象的权重,令b为容器的大小,k = n / 3允许填充的容器的数量。因此,如果可以对对象进行分区,则每个分区有3个对象,则存在3个分区。

    对于减少量,我们设置N = kb,每个bin由相同价格的b个价格标签表示(想想Pi每增加第b个标签就会增加)。令ti1≤i≤k为与第i个箱相对应的标签的价格。
    对于每个wi,我们有一个数量为wi + 1的产品Sj(以下称其为wi的根产品),而另一个wi-数量为1的产品Sj需要比Sj便宜(称为休假产品)。

    对于ti =(2b +1)i,1≤i≤k,当且仅当Bob可以以2bΣ1≤i≤kti的价格出售时,才有3个分区:

  • 如果存在3分区的解决方案,则可以在不违反限制的情况下,以相同的价格标记与分配给同一容器的对象wi,wj,wl对应的所有b产品。
    因此,该解决方案的成本为2bΣ1≤i≤kti(因为价格为ti的产品总数为2b)。
  • 考虑鲍勃销售的最佳解决方案。
    首先要观察的是,在任何解决方案中,有3个以上的根产品具有相同的价格标签,对于每个“太多”的根产品,都有一个便宜的价格标签,其粘贴在少于3个根产品上。这比任何解决方案都更糟糕,因为每个价格标签仅存在3个根产品(如果存在)。
    现在,仍然存在一个Bob's Sale的解决方案,其中每个价格带有3个根标签,但其休假产品不会带有相同的价格标签(垃圾箱有点流了)。
    假设最昂贵的价格标签为wi的根产品加标签,而后者的标签产品更便宜。这意味着用最昂贵的价格标记的3个根标签wi,wj,wl的总和不等于b。因此,标有该价格的产品的总成本至少为2b + 1。
    因此,这种解决方案的成本为tk(2b + 1)+一些其他分配成本。由于现有3分区的最佳成本为2bΣ1≤i≤kti,因此我们必须证明,刚刚考虑的情况更糟。如果tk> 2bΣ1≤i≤k-1ti就是这种情况(请注意,现在总和为k-1)。设置ti =(2b +1)i,1≤i≤k,就是这种情况。即使不是最昂贵的价格标签也是“坏”标签,但也包含其他标签,这同样适用。

  • 因此,这是破坏性的部分;-)但是,如果不同价格标签的数量是一个常数,则可以使用动态编程在多项式时间内求解它。

    关于algorithm - 问题:鲍勃的销售,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4898511/

    10-13 00:03