题解 | 购物单

购物单

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

# 输入n,m
n, m = map(int, input().split())
# 输入物品数据
data = []
for i in range(m):
    d = list(map(int, input().split()))
    data.append(d)
# 附件编号放入主件后面
for i in range(m):
    if data[i][2] != 0:
        k = data[i][2]  # 主件编号
        data[k - 1].append(i)
# 动态规划算法
# 结果初始化
result = []
N = int(n / 10)
for i in range(N + 1):
    result.append(0)
# 动态规划-倒序遍历
for i in range(m):
    if data[i][2] == 0:  # 判定是否为主件
        N = int(n / 10)
        L = len(data[i])
        mv = int(data[i][0] / 10)  # 主件价格/10
        mw = data[i][0] * data[i][1]  # 主件满意度
        if L == 3:  # 无附件
            while 1:
                if mv > N:
                    break
                result[N] = max(result[N], result[N - mv] + mw)
                N -= 1
        elif L == 4:  # 带一个附件
            num = data[i][3]
            mv1 = int(data[num][0] / 10)
            mw1 = data[num][0] * data[num][1]
            while 1:
                if mv > N:
                    break
                result[N] = max(result[N], result[N - mv] + mw)
                if mv + mv1 <= N:
                    result[N] = max(result[N], result[N - mv - mv1] + mw + mw1)
                N -= 1
        else:
            num = data[i][3]
            mv1 = int(data[num][0] / 10)
            mw1 = data[num][0] * data[num][1]
            num2 = data[i][4]
            mv2 = int(data[num2][0] / 10)
            mw2 = data[num2][0] * data[num2][1]
            while 1:
                if mv > N:
                    break
                result[N] = max(result[N], result[N - mv] + mw)
                if mv + mv1 <= N:
                    result[N] = max(result[N], result[N - mv - mv1] + mw + mw1)
                if mv + mv2 <= N:
                    result[N] = max(result[N], result[N - mv - mv2] + mw + mw2)
                if mv + mv1 + mv2 <= N:
                    result[N] = max(
                        result[N], result[N - mv - mv1 - mv2] + mw + mw1 + mw2
                    )
                N -= 1
print(result[-1])

全部评论

相关推荐

认真搞学习:28小登的建议,投算法岗不要写什么物理竞赛,互联网+,多写点项目,用什么算法做了什么。还有本科算法是不可能的开发你这个也没有项目啊
点赞 评论 收藏
分享
昨天 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务