华为笔试机考编程题 购物单 解题方案及python代码实现
2018-03-29 22:47
3335 查看
华为笔试题--购物单的解题思路及python实现题目截图:
这题可以看成一个背包问题,求满足条件下的最大值。背包问题主要的解题思路就是将原问题分解为几个子问题,并求子问题最优解。同样这里也是这样的一个思路:题目是要在N元的基础上,购买m件商品中价格与重要性乘积最大值的组合。假设能够买得起第m件物品,如果是主件,那么它有两种选择,买或者不买,这样的话,我们从这两种选择中选取所求值最大的一种可能性,我们不需要马上得到这两种选择的具体值是多少,只需对它们求一个max();如果是附件的话,不仅需要购买这件商品,还需要购买得起它的主件。如果还是能够购买得起的话,也是有两种选择,买或者不买,这时候处理的方法和上面情况一样。对所有的物品进行遍历就能求出最优解。话不多说,上代码:while True:
try:
N, m = map(int, input().strip().split())
a = [[0]*(N+1) for i in range(m+1)]
goods = []
for i in range(m):
goods.append(list(map(int, input().strip().split())))
for i in range(1, m+1):
for j in range(1, N+1):
if goods[i-1][2] == 0: # 表示是主件
if goods[i-1][0]<j: # <j表示买的起可以有选择, 这时候有两种选择,可以买也可以不买,选择最优的方案
a[i][j] = max(a[i-1][j], a[i-1][j - goods[i-1][0]]+goods[i-1][1]*goods[i-1][0])
# a[i][j] 表示用j元钱去买i件物品的最优解(这里就是(价格和重要性乘积)最大值)
else:
if goods[i-1][0]+goods[goods[i-1][2]-1][0]<j: # 要买附件的话,必须先买主件,所以必须有能买两件的钱
a[i][j] = max(a[i-1][j],
a[i-1][j-goods[i-1][0] - goods[goods[i-1][2]-1][0]]+goods[i-1][0]*goods[i-1][1]+goods[goods[i-1][2]-1][0]*goods[goods[i-1][2]-1][1])
print(a[m]
)
except:
break#理解的不对,望告知,相互学习才能共同进步
这题可以看成一个背包问题,求满足条件下的最大值。背包问题主要的解题思路就是将原问题分解为几个子问题,并求子问题最优解。同样这里也是这样的一个思路:题目是要在N元的基础上,购买m件商品中价格与重要性乘积最大值的组合。假设能够买得起第m件物品,如果是主件,那么它有两种选择,买或者不买,这样的话,我们从这两种选择中选取所求值最大的一种可能性,我们不需要马上得到这两种选择的具体值是多少,只需对它们求一个max();如果是附件的话,不仅需要购买这件商品,还需要购买得起它的主件。如果还是能够购买得起的话,也是有两种选择,买或者不买,这时候处理的方法和上面情况一样。对所有的物品进行遍历就能求出最优解。话不多说,上代码:while True:
try:
N, m = map(int, input().strip().split())
a = [[0]*(N+1) for i in range(m+1)]
goods = []
for i in range(m):
goods.append(list(map(int, input().strip().split())))
for i in range(1, m+1):
for j in range(1, N+1):
if goods[i-1][2] == 0: # 表示是主件
if goods[i-1][0]<j: # <j表示买的起可以有选择, 这时候有两种选择,可以买也可以不买,选择最优的方案
a[i][j] = max(a[i-1][j], a[i-1][j - goods[i-1][0]]+goods[i-1][1]*goods[i-1][0])
# a[i][j] 表示用j元钱去买i件物品的最优解(这里就是(价格和重要性乘积)最大值)
else:
if goods[i-1][0]+goods[goods[i-1][2]-1][0]<j: # 要买附件的话,必须先买主件,所以必须有能买两件的钱
a[i][j] = max(a[i-1][j],
a[i-1][j-goods[i-1][0] - goods[goods[i-1][2]-1][0]]+goods[i-1][0]*goods[i-1][1]+goods[goods[i-1][2]-1][0]*goods[goods[i-1][2]-1][1])
print(a[m]
)
except:
break#理解的不对,望告知,相互学习才能共同进步
相关文章推荐
- Python编程二分法实现冒泡算法+快速排序代码示例
- Python编程使用tkinter模块实现计算器软件完整代码示例
- Python编程scoketServer实现多线程同步实例代码
- 2017 小米笔试题 编程题 求树的高度 Java代码实现
- 2017 小米笔试题 编程题 求树的高度 Java代码实现
- [20180313智慧餐厅推荐系统02]基于python的socket编程代码,实现PC与服务器的简单通信
- 华为杯编程比赛最后一题题目附上自己的解题代码
- Python黑帽子--黑客与渗透测试编程之道 python3 实现代码
- 华为笔试编程python
- python编程练习---一行代码实现计算器功能
- Python编程之gui程序实现简单文件浏览器代码
- 针对上一篇文章中的代码,想出的重构方案(python实现)
- 一个函数5行代码即可实现完整的面向方面AOP编程功能
- 编程设计:PHP 5中多态性的实现方案浅析
- 轻量级的代码生成方案选择-Java基础-Java-编程开发
- Run As(运行方式) 的几种代码实现方式(Python和C#)
- 一道笔试题的代码实现,请多多请教。
- WINCE应用的UI实现方案 —— 下篇:代码一小步,项目进度管理一大步
- 某公司定制培训班笔试最后一题解题思路和解题代码
- 分布式编程->Remoting的一个代码示例(借助Remoting实现发送信息功能)