【问题标题】:Minimum cost of buying K items from N stacks with different prices从 N 个不同价格的堆栈中购买 K 个物品的最低成本
【发布时间】:2018-01-10 06:44:57
【问题描述】:

有些物品有N堆箱子。

每个盒子:可以有不同数量的物品。 每件商品的成本可能不同。

你必须购买 K 个单位的物品。 所有盒子都堆叠在一起,这意味着您只能从顶部购买并向下移动。

您如何以最优方式购买 K 件商品,从而使总成本最小化? (我们可以假设您可以购买部分盒子)

示例 1:

堆栈A = [1, 4], [2, 3], [5, 1] ,[10, 50], [1, 5]

StackB = [4, 1], [6, 7], [2, 3] ,[14, 7], [6, 1], [19, 4]

K = 10

哪里 [x, y] = [盒子里的物品数量,每件物品的成本]

最佳购买是:

StackA = 从顶部购买 2 个完整的盒子,第三个从顶部购买部分 => (1x4=4), (2x3=6), (3x1=3) = 成本 = 13强>

StackB = 购买第一盒 => (4x1=4) => 成本 = 4

购买 10 件商品的最低总成本为 4 + 13 = 17

示例 2:

堆栈A = [1, 100], [100, 1]

StackB = [10, 1], [6, 15], [25, 30] ,[15, 2], [60, 1], [19, 4]

K = 80

最佳购买是:

StackA = 买一整盒,从第二个买 79 => (1x100=100), (79x1=79), = 成本 = 179

购买 80 件商品的最低总成本为 179

【问题讨论】:

    标签: algorithm


    【解决方案1】:

    预处理:

    为每个堆栈创建一个数组cost,长度为K,其中cost[i] 是从该堆栈购买顶部i 项目的成本。

    计算:

    定义一个递归...

    function stack_cost(stack_list, limit, subtotal)
    // stack_list    list of stacks and cost array of each
    // limit         remaining quantity of items to buy
    // subtotal      cost so far
    
    best_cost = +Inf
    
    for quant in range [0:limit]
        // Buy the top "quant" items from this stack,
        //    and move on to the next.
        total = stack_cost(stack_list[1: ],
                           limit - quant,
                           subtotal + stack_list[0].cost[quant])
        if total < best_cost
            total = best_cost
            // save solution as needed
    

    请注意,这将受益于动态编程:记住给定限制和堆栈位置的最小成本。

    优化

    我认为你会发现一个更有效的攻击,方法是平分堆栈并逐步找到左侧的quant 项目和右侧的limit-quant 项目的最佳解决方案,quant 迭代允许的范围。这允许您通过二等分重复,并为您提供对单项更改进行增量估计的路径。您可以自下而上记忆部分结果,以较低的时间复杂度找到最优解。

    【讨论】:

      猜你喜欢
      • 2021-05-11
      • 1970-01-01
      • 2018-02-17
      • 1970-01-01
      • 2019-02-02
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 1970-01-01
      相关资源
      最近更新 更多