集合的子集和笛卡儿积与优惠套餐的应用

集合的子集和笛卡儿积与优惠套餐的应用

这是项目中用到的一个算法的实际应用。算法比较简单,求两个集合的子集的笛卡尔积,用于商家的后端优惠组合。还是蛮有意思的哈。

情景

举个例子。

两种优惠:
第一种是满金额减,第二种是满数量减。

第一种有多种优惠,比如:
1、满1000减200
2、满500减100

第二种有多种优惠,比如:
1、满10件商品再打8折
2、满5件商品再打9折

这四种商家可以自由多选,制定自己的优惠。

优惠先执行第一种优惠的计算,然后再计算第二种优惠的计算。

比如:
顾客买了6件商品,总额1028元。那么先可以进行“满1000减200”的优惠,需付款变成828元,然后因为“满5件商品”,可以再打9折,需付款又变成了745.2元。

解决

这么灵活的选择,怎么去计算所有的可能组合,以便进行校验和排除某些组合的操作呢?

计算所有的子集,并进行笛卡尔积,再去重应该就可以了。

代码如下:
github

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[] + []
[满1000200] + [满10件商品再打8折]
[满1000200, 满500100] + [满10件商品再打8折]
[满1000200, 满500100] + []
[满1000200, 满500100] + [满5件商品再打9折]
[] + [满10件商品再打8折]
[满500100] + [满10件商品再打8折]
[满1000200] + [满5件商品再打9折]
[] + [满10件商品再打8折, 满5件商品再打9折]
[满500100] + [满10件商品再打8折, 满5件商品再打9折]
[满500100] + []
[满1000200] + []
[满1000200] + [满10件商品再打8折, 满5件商品再打9折]
[满1000200, 满500100] + [满10件商品再打8折, 满5件商品再打9折]
[] + [满5件商品再打9折]
[满500100] + [满5件商品再打9折]