题解 | #购物单#

购物单

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向量的大小

全部评论

相关推荐

10-22 15:25
门头沟学院 C++
种花网友小松:求求你别发了,我几乎都快嫉妒得疯了,倒在床上蒙住被子就开始抱着枕头尖叫流泪,嘴里一边喊着卧槽卧槽,一边又忍着,我边发边哭,打字的手都是抖的,后来我的手抖得越来越厉害,从心头涌起的思想、情怀和梦想,这份歆羡和悔恨交织在一起,我的笑还挂在脸上,可是眼泪一下子就掉下来了。求你了别发了,我生活再难再穷我都不会觉得难过,只有你们发这种东西的时候,我的心里像被刀割一样的痛,打着字泪水就忍不住的往下流。
我的求职进度条
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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