您的位置:首页 > 编程语言 > Python开发

华为笔试机考编程题 购物单 解题方案及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#理解的不对,望告知,相互学习才能共同进步
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息