动态规划在电商订单计算的应用例子

你在网上买了一堆商品,比如说,你买了2件T恤,每件10块,5件袜子,每双5块,还有1个帽子,8块钱。但是呢,商家有个促销活动,买得越多,单价就越便宜。比如,T恤买3件以上,每件就变成9块了。这时候,怎么算出你这一单的最少花费呢?

商品价格可能会因为购买数量的不同而有所变化(购买数量越多,单价可能越便宜)

这种情况下,就可以用动态规划的方法,帮商家算出给你的最优价格

下面是一个Golang的实现例子:

package main

import "fmt"

// 商品结构体,包含单价和购买数量
type Product struct {
   单价 float64
   数量 int
}

// 计算订单总价的函数
func calculateTotalPrice(products []Product) float64 {
    // 定义动态规划数组,初始化为最大值
    dp := make([][]float64, len(products)+1)
    for i := range dp {
        dp[i] = make([]float64, 2)
        dp[i][0] = float64(1<<31) - 1 // 初始化为一个非常大的数
    }

    // 初始化第一个商品的价格
    dp[0][1] = products[0].单价 * float64(products[0].数量)

    // 动态规划填表过程
    for i := 1; i < len(products); i++ {
        for j := 1; j <= i+1; j++ {
            // 如果当前商品数量大于前一个商品的数量,则取最小值
            if j <= products[i].数量 {
                dp[i][j] = min(dp[i-1][j], dp[i-1][j-1]+products[i].单价*float64(j))
            } else {
                dp[i][j] = dp[i-1][j]
            }
        }
    }

    // 返回购买所有商品的最小总价
    return dp[len(products)][len(products)] // 因为数组是从0开始的,所以这里取最后一个商品的数量
}

// min 函数用于计算两个浮点数的最小值
func min(a, b float64) float64 {
    if a < b {
        return a
    }
    return b
}

func main() {
    // 示例商品列表
    products := []Product{
        {单价: 10, 数量: 2},
        {单价: 5, 数量: 5},
        {单价: 8, 数量: 1},
    }

    // 计算并打印订单总价
    totalPrice := calculateTotalPrice(products)
    fmt.Printf("The total price of the order is: %.2f\n", totalPrice)
}

在这个例子中,我们定义了一个Product结构体来表示商品,包含单价和数量。calculateTotalPrice函数接受一个商品列表作为输入,并返回订单的最小总价。

我们使用一个二维数组dp来进行动态规划,其中dp[i][j]表示前i个商品购买j件的最小总价。我们初始化数组,并填充第一个商品的价格。然后,我们通过两层循环来填充整个数组,每次计算都考虑两种情况:不购买当前商品(取上一个商品的最小价格)和购买当前商品(取上一个商品的最小价格加上当前商品的价格)。

最后,我们返回dp[len(products)][len(products)]作为订单的最小总价。在main函数中,我们创建了一个示例商品列表,并调用calculateTotalPrice函数来计算总价。

用通俗的方式来讲: 

      可以想象成一个表格,表格里的每个格子代表一种可能的购买组合,以及对应的最少花费。比如,第一行第一列的格子,就代表买1件T恤的花费,那就是10块。

然后,开始填这个表格。对于每一种商品,都看看,是继续按原来的价格买合算,还是多买点,享受促销价合算。比如,如果你已经买了2件T恤,再买1件就变成了3件,这时候就得看看是按原来的10块一件算便宜,还是按促销的9块一件算便宜。

 就这样,一件一件商品地算,填满整个表格。最后,表格的最右下角那个格子,就告诉你,如果你买下所有这些商品,最少要花多少钱。

是不是很有意思?

  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
主栏目导航:首页、商品列表、特价商品、拍卖、团购、品牌专卖 次栏目导航:注册、登陆、留言, 我的圈子,缺货登记,帮助 头部栏目导航: 城市切换 我的帐户 点卡 拍卖 商铺 点评空间 购物资讯 社区 底部导航:首页 | 店铺介绍 | 联系我们 | 留言中心 | 我要开店 搜索 :商品搜索,高级搜索 定单搜索 一、头部栏目导航 我的帐户 将进入我的会员中心如没登陆将转到登陆界面 点卡 展现本网站推荐优惠点卡,以及对点卡的购买 拍卖 展现本网站最新拍卖商品及会员对所感兴趣的商品价格竞拍. 商铺 展现网站中的全部商铺可以按时间或人气排序 选择一个商铺后将进入店铺页面(铺子功能主要有) 商铺首页(显示该店铺的详细信息,及本店铺的信誉度和推荐物品.可根据商品名称收索该铺子此商品) 商品列表(显示本店铺所卖的商品) 拍卖(本店铺拍卖商品) 团购(本店团购商品) 店铺介绍 留言中心(会员对此店铺的意见及评价信息) 点评空间 点击进去点评专区 点评排行 (根据点击率进行排序评论) 热门点评 (根据回复最多的评论进行排序) 热门标签 最新点评 最多鲜花(根据所得花数进行排序,点击此评论可进行送花,支持,反对意见) 购物资讯 社区 二、主栏目导行: 首页 商品列表 展现出商品分总类和总类下的所有商品分类,及商品销售排行榜 特价商品 主要展现特价打折商品,方便会员查看购买. 团够商品 品牌专卖 展现某品牌下对应的所有该品牌物品,更利于对商品分类的查询 三、次栏目导航 登陆 会员登陆 免费注册 免费注册会员,将可以在本站购买商品及获取对应的积分和商品优惠折扣. 购物车 查看在本站所购买的所有商品和所需总价格. 留言 查看对本网站的所留意见,建议. 我的圈子 点击我的圈子将进入圈子主页 对圈子的搜索 (根据圈子名称查询对应圈子) 圈子排行 (根据圈子加入会员数进行排行) 热门圈子 (根据发贴数量进行排序) 热门标签 圈子热贴(圈子中回复帖子最多的来排序) 推荐圈子 圈子添加 选中圈子进入该圈子的详细信息页和该圈子下发表的所有帖子 缺货登记 会员在本网站查询不到所需商品可以在此登记 四、搜索 商品搜索 根据商品名称进行查询 高级搜索 根据关键字 名称 ,类别 商品编码 价格范围及说明进行关联查询 订单查询 根据定单号查询此订单详细信息 易想商城会员中心 一级栏目:我是买家 我是卖家 基本信息:会员头像,会员名字,会员等级,积分,我的圈子、店铺, 退出 交易管理、帐户管理、点评圈子、个人信息 一、 交易管理 我的购物车:显示还在购物车中的商品 订单中心:所有订单、需要支付的订单、处理中的订单、需要确认收货的订单、历史订单【仿当当的】 交易明细: 统计记录该会员的所有支出,收入交易记录 我的拍卖: 记录该会员在本网站拍卖的所有商品 我的团购: 该会员所参加团购物品. 二、 帐户管理 账户信息:记录本会员全部详细信息,及兑换点券. 兑换有效期,在线支付,修改信息,我的短消息等功能. 会员积分:统计该会员在本网站的积分,及积分详细记录. 收货地址管理: 查看和添加收货人的详细地址 充值卡充值:模仿动易功能,进行会员冲值. 暂存架: 所关注的所有物品存放处.方便过后购买及关注 收藏夹: 该会员喜欢商品收藏处方便关注浏览 三、 点评圈子 我的点评: 包括我的点评和我点标签, 我的点评主要包括会员所发表的所有评论及其他会员对所发表评论的支持反对查看. 我的圈子:包括发起的圈子和参与的圈子及相对圈子所发表帖子管理. 好友管理:包括好友管理、添加好友、创建新组、分组管理 站内短信:反馈留言、撰写短消息、草稿箱、收件箱、发件箱、废件箱 四、 个人信息 个人资料: 记录该会员所有详细信息 修改密码: 会员登陆密码修改 修改资料: 修改会员的基本信息 五、 功能说明之会员积分 功能说明: (1)获得积分: A、商品积分:是购买商城上赠送积分的商品,交易成功后就可以获得相应的积分。 B、注册积分:积分可以在后台设置多少,当注册并通过认证时可获得该积分; C、介绍奖励:介绍别人注册成为商城的注册会员,可以获得积分,积分数量可以后台设置。 D、购买积分:将商城的余额转换为积分。人民币与积分的对换比例后台设置 E、会员评价:会员评价积分,积分规则后台设定; (2)积分扣除:商城用户可使用积分来兑换商品,但用户所购买的含有积分的商品退货,商城系统会在用户自己的“积分管理”中扣除相应的积分,若用户的积分不足,则相应的在商品的退款金额中减去相应的金额,按照不足积分数
好的,下面是一个简单的Python代码,用于对电商数据进行RFM分析: ```python # 导入所需的库 import pandas as pd import datetime as dt # 加载电商数据 df = pd.read_csv('ecommerce_data.csv', parse_dates=['date']) # 计算最近一次购买时间(Recency) snapshot_date = df['date'].max() + dt.timedelta(days=1) df['Days'] = (snapshot_date - df['date']).dt.days # 计算每个客户的购买频率(Frequency) frequency = df.groupby(['customer_id'])['date'].nunique().reset_index() frequency.columns = ['customer_id', 'Frequency'] # 计算每个客户的购买金额(Monetary) df['Revenue'] = df['quantity'] * df['price'] monetary = df.groupby(['customer_id'])['Revenue'].sum().reset_index() monetary.columns = ['customer_id', 'Monetary'] # 合并Recency、Frequency和Monetary rfm = pd.merge(df.groupby(['customer_id'])['Days'].min().reset_index(), frequency, on='customer_id') rfm = pd.merge(rfm, monetary, on='customer_id') # 将RFM值转换为RFM Score r_labels = range(4, 0, -1) f_labels = range(1, 5) m_labels = range(1, 5) r_quartiles = pd.qcut(rfm['Days'], q=4, labels=r_labels) f_quartiles = pd.qcut(rfm['Frequency'], q=4, labels=f_labels) m_quartiles = pd.qcut(rfm['Monetary'], q=4, labels=m_labels) rfm = rfm.assign(R=r_quartiles.values, F=f_quartiles.values, M=m_quartiles.values) # 计算RFM总分数 rfm['RFM_Score'] = rfm[['R', 'F', 'M']].sum(axis=1) # 将RFM总分数分为不同的级别 score_labels = ['Bronze', 'Silver', 'Gold', 'Platinum'] score_quartiles = pd.qcut(rfm['RFM_Score'], q=4, labels=score_labels) rfm = rfm.assign(RFM_Level=score_quartiles.values) # 输出RFM分析结果 print(rfm.head()) ``` 其中,需要注意的几点: - 电商数据应该至少包含客户ID、购买日期、购买数量、单价等字段。 - 在计算最近一次购买时间时,需要找到最近的日期,并加上一天,以确保最近一次购买时间的计算是准确的。 - 在计算每个客户的购买金额时,需要将每个订单的数量和单价相乘,得到订单的总金额。最后,对每个客户的所有订单金额求和,得到该客户的总购买金额。 - RFM值的计算需要将Recency、Frequency和Monetary分别归一化为四个等级(分别为1-4),然后将这三个等级相加,得到RFM Score。最后,将RFM Score分为四个等级(Bronze、Silver、Gold、Platinum),得到RFM Level。 以上代码仅为简单的示例,实际应用中还需要根据具体业务需求进行调整。同时,还需要对分析结果进行进一步的可视化和解释,以便更好地帮助业务决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值