你在网上买了一堆商品,比如说,你买了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块一件算便宜。
就这样,一件一件商品地算,填满整个表格。最后,表格的最右下角那个格子,就告诉你,如果你买下所有这些商品,最少要花多少钱。
是不是很有意思?