- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个订单,其中包含订单数量和折扣,需要根据订单成本按比例在这些订单之间分配。
我不是数学家,所以我会引入这个符号来解释这种情况。一个订单有 N
行,项目价格为 Pi
, 商品数量为 Qi
,总线路成本为 Ti
其中 Ti = Qi * Pi
.订单总价为T = sum(Ti)
.算法需要分配折扣D
,结果是 Di
的列表- 为每个订单行分配折扣。结果必须满足以下条件:
D = sum(Di)
: 线折扣总和必须等于原始折扣Di%Qi = 0
: 折扣必须能整除数量而没有余数Di <= Ti
: 折扣不得超过总线路成本
Di/D ~ Ti/T
: 折扣尽可能按比例分配输入数据满足以下谓词:
D <= T
, 折扣不超过总订单成本D
, Di
和 Qi
是整数值,Pi
是十进制数N=3; Qi=3; Pi=10; D=10
)。没有办法将它分配给行数。对于这种情况,算法应该返回错误以及无法分配的折扣金额(对于我的示例,它是 1)现在我们的算法实现看起来像这样(F# 上的简化版本)
type Line = {
LineId: string
Price: decimal
Quantity: int
TotalPrice: decimal
Discount: decimal
}
module Line =
let minimumDiscount line =
line.Quantity
|> decimal
|> Some
|> Option.filter (fun discount -> discount <= line.TotalPrice - line.Discount)
let discountedPerItemPrice line = line.Price - line.Discount / (decimal line.Quantity)
let spread discount (lines: Line list) =
let orderPrice = lines |> List.sumBy (fun l -> l.TotalPrice)
let preDiscountedLines = lines |> List.map (fun line ->
let rawDiscount = line.TotalPrice / orderPrice * discount
let preDiscount = rawDiscount - rawDiscount % (decimal line.Quantity)
{line with Discount = preDiscount})
let residue = discount - List.sumBy (fun line -> line.Discount) preDiscountedLines
let rec spreadResidue originalResidue discountedLines remainResidue remainLines =
match remainLines with
| [] when remainResidue = 0m -> discountedLines |> List.rev |> Ok
| [] when remainResidue = originalResidue -> sprintf "%f left to spread" remainResidue |> Error
| [] -> discountedLines |> List.rev |> spreadResidue remainResidue [] remainResidue
| head :: tail ->
let minimumDiscountForLine = Line.minimumDiscount head
let lineDiscount = minimumDiscountForLine
|> Option.filter (fun discount -> discount <= remainResidue)
|> Option.defaultValue 0m
let discountedLine = {head with Discount = head.Discount + lineDiscount}
let discountedLines = discountedLine :: discountedLines
let remainResidue = remainResidue - lineDiscount
spreadResidue originalResidue discountedLines remainResidue tail
spreadResidue residue [] residue preDiscountedLines
该算法采用了找到的一些解决方案 here并且适用于大多数情况。然而,它在以下情况下失败:
P1=14.0; Q1=2;
P2=11.0; Q2=3;
D=52
至少有一种可能的分布:D1=22; D2=30
,但目前的算法未能发现它。那么什么是更好的传播算法或更好的传播残差算法?
最佳答案
让我们将 Di/D ~ Ti/T
解释为 Di ∈ {Qi*floor(D*Pi/T), Qi*ceiling(D*Pi/T)}
。然后我们可以将这个问题解决为子集和,即,对于每个 i
使得 D*Ti/T/Qi
不是整数,并且 Qi*ceiling(D*Pi/T) ≤ Pi
,我们有一个重量为Q_i
的元素,目标总和为D - sum_i Q_i*floor(D*Pi/T)
。子集和是 NP 难的,但很弱,除非你有大量的东西,否则使用传统的动态程序解决它应该没有问题。如果问题不可行,您可以使用动态程序的最终表来找出最佳余数。
作为扩展,您可能想要支持以下解决方案,尽管 D*Ti/T
不是整数,但 Di
比替代方案更接近该比率。您可以定义项目利润,如 |floor(D*Ti/T/Qi) - D*Ti/T|^2 - |ceiling(D*Ti/T/Qi) - D*Ti/T|^2
偏好最优折扣更接近上限而不是下限的商品。然后,您正在解决背包问题(好吧,有点,因为“利润”可能是负数)而不是子集和,但 DP 变化不大。
关于algorithm - 如何在订单行上按比例分配折扣?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54709825/
我试图了解如何返回多个值。现在,我的代码设置为为任何具有一个兑换代码的代码返回单个对象(redeemDisc)。我的问题是,如果一个代码有多个兑换代码,它只会返回“多个折扣”。我试图了解如何将“red
我有一个函数discount,它接受一个“rate”参数( double )并将我的类中的私有(private)变量netPrice更新为减价。计算看似可行,但有一个问题;它会产生不准确的结果。 pu
我正在尝试获得折扣以应用于我编写的购物车。我正在使用 Adaptive API 系统,但我似乎无法正确使用它。我在 SetPaymentOptions 调用中尝试过: 'receiverO
我在尝试为我的程序创建 switch 语句时陷入困境。为了充分披露,这是明天到期的家庭作业。我应该使用 switch 语句来为所售 CD 的总费用指定折扣率。黄金级折扣 15%,银级折扣 10%,铜级
我的动画遵循这个计时函数:cubic-bezier(0.25, 0.1, 0.25, 1.0) 我想修改这个函数,所以我只得到它的结尾 40%。为了让事情变得简单,我们可以说我想要函数的最后 50%。
Paypal 的新手。在协会网站上使用“立即购买”按钮,适用于单价商品。 但是,现在客户想要设置折扣功能。我认为逻辑很简单,但就我的生活而言,我不了解文档或如何让它正常工作。 这是设置。高尔夫郊游,有
Array ( [return] => http://www.example.com/ [cancel] => http://www.example.com/ [currenc
Paypal 列出了折扣的方法,例如: discount_amount 可选与项目关联的折扣金额。它必须低于商品的售价。如果您指定 discount_amount 且未定义 discount_amou
我在 woocommerce 中有很多产品(将近 30,000 个)。常规价格已设置正确,现在我想将销售价格设置为具有一定折扣百分比的常规价格。我尝试使用一些插件,但由于产品数量,我总是遇到 PHP
如何应用税收、小计折扣以及计算总计? 我的这些段落具有以下 ID 15000 10 // In percentage 1000 // Grandtotal will be calculated an
有人知道与Stripe一次性交易是否可以接受优惠券吗? 我知道您可以添加带有定期订阅的优惠券,但我只希望能够提供一次性付款折扣。 最佳答案 我认为这里的想法是,您可以完全控制单个费用(或一次性付款,无
当产品价格为零或 100% 折扣时,我需要一个解决方案来隐藏产品页面上的“添加到购物车”按钮 我认为以下代码可能用于添加到购物车部分此代码位于以下路径中mytheme/woocommerce/单一产品
我希望为特定的可变产品设置特定的折扣,如果客户购买一种产品,他们会以 50% 的折扣获得另一种(相同的)(买一个 50% 的折扣)。我试过很多折扣插件,我发现最接近的是: WooCommerce 的定
在我上一个问题之后 WooCommerce discount: buy one get one 50% off 每当特定产品(不是所有产品)添加到购物车时,我想向购物车添加自定义通知。 我想先检查数量
我是一名优秀的程序员,十分优秀!