1. 实际应用场景与痛点
场景
- 电商平台常有“满 200 减 50”等满减活动
- 朋友或同事一起拼单,想达到满减门槛,但每个人只想买自己需要的商品
- 为了凑单可能被迫多买不需要的东西,造成浪费
- 需要公平分摊优惠金额
痛点
- 手动计算凑单组合复杂
- 容易为了凑单多买无用商品
- 优惠分摊不公平
- 缺乏数据驱动的凑单建议
2. 核心逻辑讲解
1. 输入数据
- 每个参与者的购物车(商品、单价、数量)
- 满减规则(门槛、减免金额)
- 拼单人数
2. 计算总购物车金额
- 判断是否满足满减条件
3. 优化凑单
- 在现有商品基础上,寻找最小额外花费就能达到满减门槛的组合
- 使用贪心算法或动态规划找最优补充商品
4. 优惠分摊
- 按商品原价比例分摊优惠金额
5. 输出结果
- 每人应付金额
- 推荐的凑单商品列表
3. 项目结构
group_buy_calculator/
├── data_model.py # 数据模型
├── calculator.py # 核心计算逻辑
├── optimizer.py # 凑单优化
├── config.py # 配置
├── requirements.txt # 依赖
├── README.md # 使用说明
└── sample_data/ # 示例数据
└── cart_data.json
4. 代码实现
"config.py"
# 满减规则
FULL_THRESHOLD = 200 # 满减门槛
DISCOUNT_AMOUNT = 50 # 减免金额
"data_model.py"
class CartItem:
def __init__(self, name, price, quantity, owner):
self.name = name
self.price = price
self.quantity = quantity
self.owner = owner # 参与者姓名
class GroupCart:
def __init__(self, items, members):
self.items = items
self.members = members
"optimizer.py"
def find_best_addon(cart_items, threshold, available_products):
"""
在现有购物车基础上,找最小额外花费达到满减门槛
cart_items: 当前所有商品总价
available_products: 可添加的备选商品列表 (name, price)
"""
from itertools import combinations
current_total = sum(item.price * item.quantity for item in cart_items)
if current_total >= threshold:
return [] # 已满足条件
needed = threshold - current_total
best_combo = None
min_extra = float('inf')
# 简单贪心:按价格升序尝试
sorted_products = sorted(available_products, key=lambda x: x[1])
combo = []
total_price = 0
for name, price in sorted_products:
if total_price >= needed:
break
combo.append((name, 1))
total_price += price
if total_price >= needed and total_price < min_extra:
min_extra = total_price
best_combo = combo
return best_combo
"calculator.py"
from data_model import CartItem, GroupCart
from config import FULL_THRESHOLD, DISCOUNT_AMOUNT
from optimizer import find_best_addon
def calculate_group_payment(cart, available_products):
total_before = sum(item.price * item.quantity for item in cart.items)
addons = find_best_addon(cart.items, FULL_THRESHOLD, available_products)
# 添加凑单商品
for name, qty in addons:
cart.items.append(CartItem(name, next(p[1] for p in available_products if p[0] == name), qty, "共同凑单"))
total_after = sum(item.price * item.quantity for item in cart.items)
discount = max(0, total_after - FULL_THRESHOLD) # 满减优惠
# 按原价比例分摊优惠
item_total_map = {}
for item in cart.items:
key = item.owner
item_total_map[key] = item_total_map.get(key, 0) + item.price * item.quantity
total_original = sum(item_total_map.values())
payments = {}
for owner, amount in item_total_map.items():
share = amount / total_original
payments[owner] = amount - share * discount
return payments, addons, total_after
主程序
"main.py"
import json
from data_model import CartItem, GroupCart
from calculator import calculate_group_payment
# 示例数据
cart_items = [
CartItem("洗发水", 80, 1, "Alice"),
CartItem("牙膏", 30, 2, "Bob"),
CartItem("零食", 50, 1, "Charlie")
]
members = ["Alice", "Bob", "Charlie"]
cart = GroupCart(cart_items, members)
available_products = [
("笔记本", 15),
("鼠标垫", 10),
("书签", 5),
("笔", 8)
]
payments, addons, total = calculate_group_payment(cart, available_products)
print("凑单推荐:", addons)
print("总金额:", total)
for person, pay in payments.items():
print(f"{person} 应付: {pay:.2f} 元")
5.
"requirements.txt"
# 无特殊依赖,纯 Python
6. README.md
# 拼单凑单计算器
基于大数据与商务智能,自动计算拼单最优凑单方案,避免多买无用商品。
## 功能
- 输入各人购物车
- 自动判断是否可满减
- 推荐最少额外花费的凑单商品
- 公平分摊优惠金额
## 使用
1. 修改 `main.py` 中的购物车数据和可添加商品
2. 运行:
bash
python main.py
## 数据格式
CartItem: (商品名, 单价, 数量, 拥有者)
available_products: [(商品名, 单价)]
7. 核心知识点卡片
知识点 说明
满减规则建模 用数学条件表示促销逻辑
贪心算法 快速找到近似最优凑单组合
优惠分摊 按原价比例公平分配优惠
数据模型 用类封装购物车与商品信息
组合优化 在有限商品中选择最小额外花费组合
8. 总结
本程序通过数据驱动 + 优化算法,解决了拼单凑单中的浪费与公平性问题,让用户在享受优惠的同时不买无用商品。
未来可扩展:
- 接入电商 API 实时获取商品价格与促销
- 使用动态规划或整数规划求精确最优解
- 增加 Web 界面方便多人协作输入
- 支持多种满减规则(阶梯满减、折扣券等)
如果你需要,还可以做一个带图形界面的拼单计算器(Tkinter 或 Web),让用户可以直观选择商品和看到分摊结果。
利用AI高效解决实际问题,如果你觉得这个工具好用,欢迎关注我!