以不同价格从N堆购买K项的最低成本

时间:2017-08-02 21:09:14

标签: algorithm

有一些项目的N堆栈。

每个框:可以有不同数量的项目。           每件商品可以有不同的费用。

你必须购买K件物品。 所有盒子都堆叠起来,这意味着你只能从顶部购买并向下移动。

您如何以最佳方式购买K物品,以便最大限度地降低总成本? (我们可以假设您可以购买部分盒子)

示例1:

StackA = [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个完整的盒子,第三个部分来自顶部=>     ( 1 x4 = 4),( 2 x3 = 6),( 3 x1 = 3)=成本= 13

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

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

示例2:

StackA = [1,100],[100,1]

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

K = 80

最佳买入将是:

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

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

1 个答案:

答案 0 :(得分:0)

预处理:

为每个堆栈创建一个数组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项的最佳解决方案来找到更有效的攻击,{{1迭代允许的范围。这允许您通过二分法重复,并为您提供路径,以便对单项更改进行增量估算。您可以自下而上记忆部分结果,在较短的时间复杂度内找到最佳解决方案。