题解 | #购物单#

购物单

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

basic = list(map(int, input().split()))
N = basic[0]
items = []
for _ in range(basic[1]):
    items.append(list(map(int, input().split())))
for i in range(len(items)):
    if items[i][2]:
        items[items[i][2] - 1].append(items[i][:])
        items[i] = []
dp = [0] * (N + 1)
for itm in items:
    if itm:
        val = itm[0]
        satis = itm[1]
        if len(itm) == 3:
            for i in range(N, -1, -1):
                if val <= i:
                    dp[i] = max(dp[i], dp[i - val] + val * satis)
        if len(itm) > 3:
            dp_se = dp[:]
            for i in range(N, -1, -1):
                if val <= i:
                    dp_se[i] = dp[i - val] + val * satis  # 选择第i件物品
            for i in range(3, len(itm)):
                val_a = itm[i][0]
                w = itm[i][1]
                for j in range(N, -1, -1):
                    if val_a + val <= j:
                        dp_se[j] = max(dp_se[j], dp_se[j - val_a] + val_a * w)
            dp = [max(dp[i], dp_se[i]) for i in range(len(dp))]
print(dp[-1])



先把附属的物件加入进真正的物件中,在进行01背包的时候判断是否有附属物件,如果有的话就新增一个矩阵判断取的情况,最后再判断不增加和增加物件的dp向量的大小

全部评论

相关推荐

06-25 09:33
厦门大学 Java
程序员饺子:现在日常估计没啥hc了,等到八月多估计就慢慢有了。双九✌🏻不用焦虑的
投递快手等公司7个岗位
点赞 评论 收藏
分享
06-14 19:09
门头沟学院 Java
darius_:给制造业搞的,什么物料管理生产管理,设备管理点检,最最关键的就是一堆报表看板。个人觉得没啥技术含量都是些基本的crud,但是业务很繁琐那种
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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