华为笔试机考丨牛客每天一道·三道编程题O题解 | #购物单#

购物单

https://www.nowcoder.com/practice/f9c6f980eeec43ef85be20755ddbeaf4

def main():
    N, m = map(int, input().split())
    N = N // 10
    items = [tuple(map(int, input().split())) for _ in range(m)]

    primary, accessory = [], [[] for _ in range(m)]
    for i, item in enumerate(items):
        if item[2] == 0:
            primary.append((item[0] // 10, item[1] * item[0], i))
        else:
            accessory[item[2] - 1].append((item[0] // 10, item[1] * item[0]))

    dp = [0] * (N + 1)
    for item in primary:
        for i in range(N, item[0] - 1, -1):
            dp[i] = max(dp[i], dp[i - item[0]] + item[1])
            for acc in accessory[item[2]]:
                if i >= item[0] + acc[0]:
                    dp[i] = max(dp[i], dp[i - item[0] - acc[0]] + item[1] + acc[1])
                if len(accessory[item[2]]) > 1:
                    acc2 = accessory[item[2]][0] if accessory[item[2]][1] == acc else accessory[item[2]][1]
                    if i >= item[0] + acc[0] + acc2[0]:
                        dp[i] = max(dp[i], dp[i - item[0] - acc[0] - acc2[0]] + item[1] + acc[1] + acc2[1])

    print(dp[-1])


if __name__ == "__main__":
    main()

这道题目是一个带有条件约束的背包问题。我们首先需要将主件和附件区分开来,并将它们的价格和重要度按要求计算。接下来,我们将使用动态规划解决这个问题。

  1. 将输入的物品数据分成两个部分:主件和附件。主件是附件所依赖的物品,附件是与主件相关的物品。我们用一个主件列表存储所有主件的价格、重要度乘积和索引。同时,我们使用一个二维列表存储每个主件的附件。
  2. 初始化一个长度为 N//10+1 的动态规划数组 dp,其中 N 为总钱数。这里我们将所有物品的价格除以 10,以简化计算。数组 dp 用于存储在不同预算下所能获得的最大满意度。
  3. 遍历所有主件,对于每一个主件,我们需要分别考虑以下情况:只购买主件,不购买附件。更新 dp 数组,将当前预算下的满意度与购买主件后的满意度进行比较,取较大值。购买主件和一个附件。遍历每一个附件,更新 dp 数组,将当前预算下的满意度与购买主件及附件后的满意度进行比较,取较大值。购买主件和两个附件。遍历所有附件组合,更新 dp 数组,将当前预算下的满意度与购买主件及两个附件后的满意度进行比较,取较大值。
  4. 最后,dp 数组的最后一个元素就是我们要求的最大满意度。

通过这个思路,我们可以解决这个带有条件约束的背包问题。

#23届找工作求助阵地##题库##编程题#
全部评论

相关推荐

05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
04-25 10:45
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务