大促凑单,为什么你总是凑不好?
每次双11、618打开购物车,面对满300减50的跨店满减规则,你是不是也有过这样的困惑:想买的东西总价278元,差22元才能满减,加什么商品最划算?加了之后又担心"为了凑单买不需要的东西"。这其实是一个经典的凑单算法问题——如何在最少额外支出下,最大化满减优惠。
本文将这个问题抽象为数学模型,给出可操作的最优凑单组合求解方法。无论是凑满300减50,还是满200减30,这套方法论都适用。
凑单问题的数学定义
什么是凑单
在跨店满减场景中,凑单指的是:当你的目标商品总金额未达到满减门槛时,通过添加额外商品使得总金额达标,从而获得满减优惠的行为。
本质上,凑单是一个受约束的优化问题:
给定目标商品集合 T(你想买的商品),总金额为 S(< 门槛 M),从可选商品池 P 中选取一个或多个商品加入购物车,使得最终总金额 ≥ M,且额外支出最小化。
形式化模型
用数学语言描述:
已知:
M = 满减门槛(如 300 元)
S = 目标商品总金额(S < M)
G = 满减优惠金额(如 满300减50 → G = 50)
P = 可选凑单商品池,每个商品有价格 pᵢ
目标:
找到凑单商品子集 C ⊆ P,使得:
minimize: Σ(pᵢ) - G(净额外支出)
subject to: S + Σ(pᵢ) ≥ M(满足门槛)
这本质上是一个带约束的最小化问题,与经典的背包问题有相似之处,但约束条件和目标函数有所不同。
三种求解策略对比
策略一:贪心凑单(最常用,不保证最优)
贪心策略的核心思路是:选最接近差额的单个商品。
| 步骤 | 操作 |
|---|---|
| ① | 计算差额 D = M - S |
| ② | 在商品池中找到价格最接近 D 且 ≥ D 的商品 |
| ③ | 如果没有单个商品满足,选价格最接近 D 的多个商品 |
优点:计算简单,快速决策 缺点:可能不是全局最优解——两个便宜商品的组合可能比一个贵商品更划算
策略二:枚举搜索(小规模商品池最优解)
当可选凑单商品数量较少时(比如限定在10个以内),枚举所有组合可以找到精确的最优解。
算法伪代码:
def optimal_coupon(S, M, G, products):
best_cost = ∞
best_combo = []
n = len(products)
for mask in range(1, 1 << n): # 枚举所有非空子集
total_extra = 0
combo = []
for i in range(n):
if mask & (1 << i):
total_extra += products[i].price
combo.append(products[i])
if S + total_extra >= M:
net_cost = total_extra - G
if net_cost < best_cost:
best_cost = net_cost
best_combo = combo
return best_combo, best_cost
时间复杂度为 O(2^n),n ≤ 15 时可在合理时间内求解。
策略三:动态规划(大规模商品池最优解)
当商品池较大时,动态规划是更高效的解法。将问题转化为:
在商品池中选取子集,使总价格在 [D, D+Δ] 区间内,且总价格最小化。
def dp_optimal_coupon(S, M, G, products):
D = M - S # 需要凑的差额
max_price = max(p.price for p in products)
MAX_SUM = D + max_price # 搜索上界
# dp[i] = 能否恰好凑到金额 i
dp = [False] * (MAX_SUM + 1)
dp[0] = True
for p in products:
for j in range(MAX_SUM, p.price - 1, -1):
if dp[j - p.price]:
dp[j] = True
# 找到 ≥ D 的最小可达金额
for i in range(D, MAX_SUM + 1):
if dp[i]:
return i - G # 净额外支出
return None # 无法凑到门槛
时间复杂度 O(n × max_price),空间复杂度 O(max_price)。
三种策略对比
| 维度 | 贪心 | 枚举 | 动态规划 |
|---|---|---|---|
| 时间复杂度 | O(n) | O(2^n) | O(n×max_price) |
| 是否保证最优 | 否 | 是(n≤15) | 是 |
| 适用场景 | 快速决策 | 精选少量候选 | 大量候选商品 |
| 实现复杂度 | 低 | 低 | 中 |
| 实际推荐指数 | ★★★☆☆ | ★★★★☆ | ★★★★★ |
真实案例:三组凑单方案实测
以下用京东平台上实际商品价格做凑单推演。假设大促规则:跨店满300减50。
场景设定
你计划购买以下目标商品:
| 商品 | 到手价 |
|---|---|
| 德佑悬挂式洗脸巾 160抽×4提 | ¥62.91 |
| 惠润洗发水 600ml×2瓶 | ¥89.90 |
| 漫花抽纸 5层400张×18包 | ¥27.90 |
| 目标商品合计 S | ¥180.71 |
差额定 D = 300 - 180.71 = ¥119.29。满减优惠 G = ¥50。
可选凑单商品池
在京东搜索日用品,筛选自营+有优惠券,得到以下候选:
| 编号 | 商品 | 到手价 | 品类 |
|---|---|---|---|
| A | 五月花抽纸 2层200抽×36盒 | ¥144.00 | 纸品 |
| B | 德佑婴儿柔纸巾 120抽×30包 | ¥111.51 | 纸品 |
| C | 维达超韧抽纸 3层120抽×24包 | ¥49.90 | 纸品 |
| D | 蓝月亮洗衣液 3kg×2瓶 | ¥59.90 | 清洁 |
| E | 佳洁士牙膏 180g×3支 | ¥35.90 | 个护 |
| F | 舒肤佳沐浴露 720ml×2瓶 | ¥69.90 | 个护 |
方案A:贪心策略
选最接近差值119.29的单个商品:B(德佑柔纸巾 ¥111.51)
| 项目 | 金额 |
|---|---|
| 目标商品 | ¥180.71 |
| 凑单商品 B | ¥111.51 |
| 总金额 | ¥292.22 |
| 满减后 | ❌ 未达300门槛,不享受满减 |
单个商品不够,尝试贪心双商品。找总和最接近119.29的组合:
- C + D = 49.90 + 59.90 = ¥109.80
- C + F = 49.90 + 69.90 = ¥119.80
- E + D = 35.90 + 59.90 = ¥95.80
- E + F = 35.90 + 69.90 = ¥105.80
最优组合:C + F = ¥119.80(超过119.29仅0.51元)
| 项目 | 金额 |
|---|---|
| 目标商品 | ¥180.71 |
| 凑单 C + F | ¥119.80 |
| 合计 | ¥300.51 |
| 满减后 | ¥250.51 |
| 净额外支出 | ¥119.80 - ¥50 = ¥69.80 |
方案B:枚举搜索
枚举所有满足 S + 凑单 ≥ 300 的组合(6个商品,64种子集),找出净额外支出最小的:
| 凑单组合 | 总金额 | 满减后支付 | 净额外支出 |
|---|---|---|---|
| C + D | ¥290.51 | ❌ 不达标 | — |
| C + F | ¥300.51 | ¥250.51 | ¥69.80 |
| D + F | ¥310.51 | ¥260.51 | ¥79.80 |
| C + D + E | ¥326.41 | ¥276.41 | ¥95.70 |
| A | ¥324.71 | ¥274.71 | ¥94.00 |
| B | ¥292.22 | ❌ 不达标 | — |
枚举最优解 = C + F,净额外支出 ¥69.80,与贪心结果一致。
方案C:差额复用——更优解
但如果改变思路:凑单商品也可以是"本来就需要但略超预算"的东西,比如把 B(德佑柔纸巾 120抽×30包 ¥111.51)单独拿下:
| 方案 | 凑单组合 | 额外支出 | 净支出 | 获得商品 |
|---|---|---|---|---|
| 贪心/枚举 | C + F | ¥119.80 | ¥69.80 | 抽纸+沐浴露 |
| 差额复用 | B | ¥111.51 | ¥61.51 | 柔纸巾30包 |
差额复用方案净支出仅 ¥61.51,比贪心少花了 ¥8.29,且只加了一个商品!这是因为 B 虽然单价 ¥111.51 未满差额,但总金额 180.71 + 111.51 = 292.22,仍不够300!
这是一个关键陷阱:贪心可能找到的是"总金额刚好过门槛"但凑单品组合总价更高的解。
实际上,正确的解法应该考虑更大范围的候选。如果加入一个 ¥120-130 区间的商品:
| 假设商品 X | ¥124.90 |
|---|
| 方案 | 凑单 | 额外支出 | 净支出 |
|---|---|---|---|
| X 单独 | ¥124.90 | ¥74.90 | |
| B + E | ¥147.41 | ¥97.41 | |
| C + D + E | ¥145.70 | ¥95.70 |
最优单商品 X 净支出 ¥74.90,不如 C+F 组合的 ¥69.80。
结论:不存在绝对的最优策略,最优解依赖具体商品池。使用动态规划是找到真最优的最佳方式。
凑单的四个实用心法
心法1:锁定「差额定」的黄金区间
差额定 D = M - S 是关键。凑单商品的理想价格范围是 D 到 D+30 元。太便宜需要多个,太贵不划算。
比如差额定 119.29 元,优先找 120-150 元的商品。
心法2:优先选择「硬通货」
最适合凑单的品类:纸品、清洁用品、个护、粮油调味——这些是消耗品,囤了迟早用得上。避免凑单"冲动消费品",比如一件"看起来不错"的衣服。
| 推荐凑单品 | 不推荐凑单品 |
|---|---|
| 抽纸/卷纸/湿巾 | 不急需的服饰 |
| 洗衣液/洗洁精 | 电子产品配件 |
| 牙膏/洗发水/沐浴露 | 装饰品/摆件 |
| 米面粮油/调味料 | 不确定尺码的鞋 |
心法3:善用平台「凑单推荐」
淘宝和京东在购物车页面通常有"再凑XX元享满减"的智能推荐模块,这些推荐商品往往是同店铺或同品类的低价商品。优先从这里挑选,因为:
- 确保参与跨店满减
- 价格阶梯合理
- 通常能叠加店铺券
心法4:多档满减的跳跃策略
部分大促有多档满减,如满200减30 + 满300减50。如果目标商品总价在200附近,需要权衡:
跳到300档需要额外凑100元,但多减20元。净收益 = 20 - 额外凑单成本。如果凑单买的是必需品,净收益为正则值得跳档。
计算一下:
| 方案 | 目标商品 | 凑单 | 总支付 | 获得(目标+凑单) |
|---|---|---|---|---|
| 200档 | ¥180.71 | ¥19.29 | ¥170.00 | ¥200.00 价值 |
| 300档 | ¥180.71 | ¥119.80 | ¥250.51 | ¥300.51 价值 |
跳档到300:多花 ¥80.51,但多获得 ¥100.51 价值的商品。如果凑单商品都是需要的,实际赚了 ¥20。
常见误区与避坑指南
误区1:「凑了就退」
很多人想"凑单后把凑单商品退了",但跨店满减订单中,退款会导致满减优惠按比例重新计算。如果凑单商品退款后总额不达标,需要补回满减金额。
正确做法:凑单买消耗品,用得上的东西。
误区2:「随便加一个就行」
拍脑袋加商品往往导致净额外支出过高。以本文案例为例,如果随手加了商品 A(¥144),净额外支出高达 ¥94,比最优方案多花 ¥24.20。
误区3:「越接近门槛越好」
追求"刚好达标"是合理的,但前提是凑单商品确实是需要的。为了"0.51元差额"加一个 ¥49.90 的沐浴露,如果家里已经有囤货,本质上就是 50 元换了 50 元优惠 = 0 净收益。
总结与建议
核心结论:
- 凑单的本质是约束优化:在满足满减门槛的前提下,最小化额外的净支出。用动态规划可以找到精确的最优解。
- 没有放之四海皆准的最优策略:贪心、枚举、DP 各有适用场景。日常购物推荐使用枚举法(候选商品10个以内),复杂场景使用动态规划。
- 凑单商品选消耗品:纸品、清洁、个护等刚需消耗品是最佳凑单选择,避免"为了满减而满减"。
实操建议清单:
- 大促前盘点家中消耗品库存,列出"可凑单清单"
- 计算差额定 D,在 D~D+30 区间内搜索凑单候选
- 使用 折券凑单计算器 快速算出最优组合
- 检查凑单商品是否参与跨店满减(认准活动标签)
相关阅读:
- 满减叠加的最优顺序:折扣数学的深度拆解 — 了解满减与券的叠加优先级
- 折扣率计算公式详解:3种算法场景与实例 — 掌握折扣率计算方法
- 跨店满减是什么?规则、限制与常见误区 — 跨店满减基础概念入门
本文由折小算原创,数据来源为京东平台实时商品价格。商品价格以购买时实际页面为准。