洛谷P2871与背包

本文介绍了如何利用背包算法解决P2871问题,即在不超过特定重量限制的情况下,找到能实现最大价值的物品组合。文章通过分析错误的动态规划思路,详细解释了经典的双层循环背包算法,通过比较不同状态下的价值和,确定每个重量下的最大价值,并给出实际代码示例以加深理解。
摘要由CSDN通过智能技术生成

背包用于寻找最优解,适用于在一堆数值中找寻符合题目要求条件的最优组合。

背包其实就是两个循环(蒟蒻的蒟蒻总结)

以P2871为例:在可装下的条件下找到最大价值组合。

起初想用(自认为是动归)(蒟蒻的思路):

倒着想:第五个有装下装不下两种情况:

1.装下:五个的价值和。

2装不下:判断“四个的最大价值和”与“三个的最大价值和”+“第五个的价值”哪个价值和更大?

   最大值即为所找的当今最大价值和。

但是这里有个疑似bug。就是可能“最大价值和的那三个”的重量加上第五个的重量可能还是超重。。。

尴尬。。。

蒟蒻不会修这段。(没本事使我警醒)于是去敲两个循环:也就是背包。

背包就是用数组来表示在某个重量下,通过循环找到最大价值和。

建立一个数组来存储最大价值和,下标表示重量,循环范围是从最大重量开始,到所循环的物品重量为止,依次相减。

所以第一个循环用来循环每件物品,内部的第二个循环用来输入、判断、存储该重量下的最大价值和。

判断的大致思路就是:

(例如现在循环到了重量为a[i],价值为b[i]的物品)用x[t]来表示重量为t时的存储价值。

比较x[t-a[i]]+b[i]与x[t]的价值哪个更大。表示就是:是占用a[i]的重量然后进入b[i]的价值所带来的价值和更多?还是原封不动更多?判

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值