问题描述:
商店中每种商品都有标价.例如,一朵花的价格是2元.一个花瓶的价格是5元.为了吸引顾客,商店提供了一组优惠商品价. 优惠商品是把一种或多种商品分成一组,并降价销售.例如,3朵花的价格不是6元而是5元.2个花瓶加1朵花的优惠价是10元.是设计一种算法,计算出某一顾客所购商品应付的最少费用.
参考的知识:动态规划. 程序语言不限.
题目分析:
- 首先确定需要哪些数据,要想实现这个题目,我们需要如下几个数据,
共有多少种优惠方案s_num,每个优惠方案的构成第i种物品需要几 个,并且优惠后价格为多少的一个数据村粗s1,s2,s3等等,优惠方案 组成的列表s。客户需要的商品数量s,以及商品价格p。
2.其次要确定购物最消费的实现目的, 我们的目的是顾客的要求依据商家的优惠规则得出一个最优的优惠组合方案, 然后输出最低价格。
3.算法思想实现如下:通过递归, 我们可以遍历所有的优惠规则, 如果满足优惠规则,那么就会产生一个新的子问题,这个子问题同样是计算当前状态的最小花费情况,需要我们注意的是,优惠规则很有可能是多个的,那么我们在考虑这n个优惠规则时候,产生的n个子问题的最优解加上优惠价格,得到最小值,就是我们所需要的。这个时候就会用到递归去实现。递归停止的条件就是如果所有的优惠规则都不满足则返回剩余商品的按原价得出的总价. 通过这样的思想,我们就可以计算出用户需要的物品的最优优惠方案。
4.状态转移方程式:F(a1,a2,a3,a4,a5)= min{F(a1-s1,a2-s2,a3-s3,a4-s4,a5-s5)+Cost(s)}
cout = 0
def MinCost(num,p,s):
global cout
cost = list()
tag = 0
for i in range(s[0]):
if num[0] >= s[i+1][0][1] and num[1] >= s[i+1][1][1] and num[2] >= s[i+1