计算最便宜的购物篮

时间:2014-09-18 11:59:13

标签: algorithm shopping-cart

给出产品表:

Products
ID | Name | PriceCents

bundles这些产品的集合在一起购买时会给予折扣:

Bundles
ID | Name

BundleItem
BundleID | ItemID | QuantityRequired | DiscountPercent

鉴于basket中的商品ID和数量的集合,您如何计算哪些捆绑包为客户提供最优惠的价格?

我认为这样做的唯一方法是蛮力所有组合,但它看起来并不优雅。

由于捆绑包可以由用户生成,因此可能存在很多捆绑包,并且可能存在两个具有相同项目但具有不同折扣的捆绑包。

1 个答案:

答案 0 :(得分:1)

您可以使用dynamical programming解决此问题。

主要思想是你有一个桶的二进制表示 - varialbe binBucket。因此,如果第i位设置为1,则表示您的存储桶包含第i个产品,反之亦然。

然后您有一些数组A,其中A[binBucket]是该集合的最佳价格,其中包括binBucket当前存储桶的二进制表示所描述的所有产品。

一开始,您有A[0]=0,因为空桶的价格为0

然后,迭代桶的所有可能的二进制表示(2 N 状态/不同的桶),并尝试添加所有可能的包。当您尝试添加捆绑包时,您的二进制表示将会更改(作为价格)。

因此,您将进行更新

A[binBucketCurrent + binBundle] = min(A[binBucketCurrent + binBundle], A[binBucketCurrent] + bundle.price)

binBundle这里是bundle的二进制表示,与bucket相同。

所以,最后你将在阵列的 2 N -1

中获得最优惠的价格。

整体效率 O(2 N M),其中M是可用的捆绑数,N是产品

更新:当然,可能会有很多产品,并且您无法将它们作为二进制掩码放入变量中。因此,您可以使用set,但这会稍微影响效率,但这是更直观的方法。

相关问题