我前一阵子在Stack Overflow上问过这个问题:问题:Bob的sale。有人建议也将问题张贴在这里。
有人已经在这里提出了与此问题相关的问题- 给定基数的最小重量子森林 -但据我了解,这对我的问题没有帮助。StackOverflow上评分最高的答案也值得一看。
这是我的StackOverflow问题的逐字记录副本。该网站的格式可能不适当(哎呀,我只是在这里问这个问题而感到没有足够的知识),因此可以随时对其进行编辑:
注意:这是对现实生活中有关对SWF文件中的记录进行排序的问题的抽象措词。一个解决方案将帮助我改善开源应用程序。
鲍勃(Bob)有一家商店,并想进行销售。他的商店有许多产品,并且每种库存产品都有一定数量的单位数量。他还具有许多在架子上安装的价格标签(与产品数量一样多),并且价格已经打印在标签上。他可以在任何产品上贴上任何价格标签(该产品的全部库存价格统一为一件产品),但是某些产品还有其他限制-任何此类产品可能都不比某些其他产品便宜。
您必须找到如何安排价格标签的方法,以使鲍勃所有商品的总成本尽可能低。总成本是每种产品分配的价格标签的总和乘以该产品的库存数量。
鉴于:
- N –产品数量和价格标签
- 小号我,0≤ 我 <N -与指数产品的库存数量我(整数)
- P Ĵ,0≤ Ĵ <N -具有索引价格标签上的价格Ĵ(整数)
- K –附加约束对的数量
- 甲ķ,B ķ,0≤ ķ <K -产品指数对附加的约束
- 任何产品索引最多只能在B中出现一次。因此,由该邻接表形成的图实际上是一组有向树。
该程序必须找到:
- 中号我,0≤ 我 <N -从产品索引映射到价格标签指数(P 中号我是产品的价格我)
满足条件:
- P 中号甲ķ ≤P 中号乙ķ,对于0≤ ķ <K
- Σ(š 我 ×P 中号我)为0≤ 我 <N是最小
请注意,如果不是针对第一个条件,则解决方案将是简单地按价格对标签进行排序,并按数量对产品进行排序,然后直接将二者进行匹配。
输入的典型值为N,K <10000。在现实生活中,只有几个不同的价格标签(1、2、3、4)。
这是为什么大多数简单的解决方案(包括拓扑排序)不起作用的一个示例:
最佳解决方案是:
Price, $ 1 2 3 4 5 6 7 8 9 10
Qty 9 8 7 6 1 10 5 4 3 2