给出产品表:
Products
ID | Name | PriceCents
bundles
这些产品的集合在一起购买时会给予折扣:
Bundles
ID | Name
BundleItem
BundleID | ItemID | QuantityRequired | DiscountPercent
鉴于basket
中的商品ID和数量的集合,您如何计算哪些捆绑包为客户提供最优惠的价格?
我认为这样做的唯一方法是蛮力所有组合,但它看起来并不优雅。
由于捆绑包可以由用户生成,因此可能存在很多捆绑包,并且可能存在两个具有相同项目但具有不同折扣的捆绑包。
答案 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
,但这会稍微影响效率,但这是更直观的方法。