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