题解 | #购物单#

购物单

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

全部评论

相关推荐

09-09 21:23
门头沟学院 Java
程序员牛肉:小牛肉来也! 主要就是没有实习经历。因为你的投递方向肯定是中小厂。在小厂中,很少会有公司愿意花钱培养你。因此会更加青睐有实习的同学。再加上你的学历比较差一点,所以找不到是正常的。 跟简历项目啥的已经没有大关系了,就是差一份实习。秋招和日常实习一起投递吧。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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