华为笔试机考编程题 购物单 解题方案及python代码实现

华为笔试题--购物单的解题思路及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][N])
    except:
        break
#理解的不对,望告知,相互学习才能共同进步

猜你喜欢

转载自blog.csdn.net/weixin_39561100/article/details/79750304