双十一到来,对未来满满的焦虑感一直在push着我买些书来寻求心理安慰。然而京东和当当的优惠政策不同:前者满100减50,但单价贵;而后者直接给出折后价。经过一番思想挣扎,确定了要买以下六本书,分别在京东和当当上查看了今日的价格
书名 | 京东 | 当当 | 方案1 | 方案2 |
---|---|---|---|---|
计算机网络:自顶向下方法 | 84.6 | 70.3 | JD | JD |
深入理解计算机系统 | 132.1 | 90.4 | JD | JD |
算法导论 | 121.6 | 96 | JD | JD |
编程之美 | 75.1 | 37.6 | DD | DD |
剑指offer | 61.8 | 30.9 | DD | JD |
程序员代码面试指南 | 103.6 | 377 | DD | DD |
合计(优惠后) | 328.8 | 377 | 188.3+120.3=308.6 | 200.1+89.4=289.5 |
根据京东和当当的价格初步选了方案1和方案2,感觉是比较实惠的。但是,在最终决定之前,贫穷让我理智了起来…
不!我要最便宜。
于是乎,打开电脑,new一个book.py,考虑算法?不存在的,小菜鸟确实做不到哇。。。简单暴力法遍历一遍,不就六本书嘛,高中的排列组合来一下不就六六、六五、五四…这么多种情况嘛,然后写个组合的函数?
额。。。情况有点多了,那啥,用python还要我造这个轮子吗?
python的组合嘛,找到它了,from itertools import combinations
,试验一下
>>> from itertools import combinations
>>> a = list(range(0,6))
>>> list(combinations(a,2))
[(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)]
导入后,那就开始干吧。先定义京东和当当的两个价格列表
JD = [84.6, 132.1, 121.6, 75.1, 61.8, 103.6]
DD = [70.3, 90.4, 96, 37.6, 30.9, 51.8]
首先考虑在京东上选某几本书,可能是0本、1本、2本。。。6本,找到对应的索引就好了,然后剩下的索引就是从当当买的书啦。主要的代码如下
index = list(range(0,6))
res = []
for n in range(0,7): #n=1~5
index_arr_JD = list(combinations(index, n)) # 从京东购买书籍的索引列表,每个元素是某种情况的索引数组
for tup in index_arr_JD: # tup对应着京东购买书籍的一种索引组合情况
index_arr_DD = list(set(index)^set(tup)) # 从当当购买书籍的索引
# 京东购买的图书的价格
price_JD = sum(JD[i] for i in tup)
price_JD -= (price_JD // 100) * 50
# 当当购买的图书的价格
price_DD = sum(DD[i] for i in index_arr_DD)
# 保存数据
item = ['京东:', tup, '京东价格', round(price_JD,2),
'当当', index_arr_DD, '当当价格', round(price_DD,2), '总价', round(price_JD + price_DD, 2)]
res.append(item)
上面代码中的item保存价格数据的时候使用了round,主要是因为python的浮点数计算不准确,小数点后面会跟着很多位数。
到这里把所有方案都保存下来了,最后,根据总价对结果排序,并打印出来就大功告成啦。
res.sort(key=lambda x: x[-1])
print('一共有%d组数据' % len(res))
for e in res:
print(e)
得到结果如下
排在第一的就是我在前面提出的方案2,看来我的直觉还不错!可以踏实地买书了。
从上面的点出发,可以考虑这么一个问题:要购买N个/种商品,有m个平台给出的价格及其优惠政策,如何找到它最便宜的购买方案?
想看问题的解决代码?
然而
说了这么多,咳咳,总结一哈子:对于双十一,我向来是敬而远之的。现在双十一这么多平台搞活动,优惠规则这么复杂,我买几本书都要这么抠抠索索,精打细算的,对于那些要研究各种优惠规则、买大量东西的人,要是这么精打细算,岂不是头都要炸了哇。要是有个app或者网站能够帮我们解决这种问题,那可省事省钱了啊