背包问题

  • 背包有最大承重,商店中的每种物品都有价值与重量两个属性,基于此提出各种问题:装下最多重量物品、装下最大总价值物品、有多少种方式正好带走满满一书包物品等等。

 

  • Backpack,最简单的题型是背包中的物品能不能拼出重量target,求出最大的target,背包问题中,数组大小与总承重有关背包问题要把总承重放入状态!这是很特殊的一个地方。要求前N个物品能不能拼出重量0,1,...,M,子问题是需要知道前N-1个物品能不能拼出重量0,1,...,M,由此得出状态f[i][w] =  能否用前i个物品拼出重量w(true/false)。转移方程如下:

 

                  

               

 

  • Backpack5,题目改成有多少种方式拼出target,要求前N个物品有多少种方式拼出重量0,1,...,targer,需要知道前N-1个物品有多少种方式拼出重量0,1,...,target,状态设f[i][w] = 用前i个物品有多少种方式拼出重量w,转移方程如下:

               

 

这里提出了一种空间优化的方法,基于原有的思路,可以开辟一个两行的数组进行优化,当采用从后往前的方式进行计算时,不会出现覆盖的情况,所以这里可以进一步优化。代码:

 

         

 

  • Backpack6,与上面题目的区别是每个重量可以重复用多次,这里需要回到一维的思路,类似于Coin Change,这里的最后一步是枚举如果最后一个物品的重量是A0,...An-1,则要求有多少种组合能拼成Target - A0,..Target - An-1,状态是f[i] = 有多少种组合能拼出重量i,转移方程如下:

 

                   

这里的边界情况要注意一下,如下:

 

          

 

       

 

  • Backpack2,背包有最大承重,每个商品有着各自不同的价值,求背包中能放入的最大价值的物品。如果对于每个总重量,我们能知道对应的最大价值是多少,就能通过一个for循环找出答案,所以这里的状态也是从总承重的角度考虑(即重量作为数组下标,价值作为数组元素),当然也会存在某些重量拼不出来的情况,可以设为无穷小。对于背包问题,最后一步的考虑方式有两种:最后一个物品是否进入背包,以及最后进入背包的物品是哪一个!这里在实际编程时使用了一维数组进行空间优化,需要注意的是当使用一位数组时,要从后往前做,倒着计算。状态和转移方程如下:

 

                   

初始条件和边界情况:

 

         

 

核心代码:

 

               

 

  •  Backpack3,与上一题的区别在于每种物品都有无穷多个。从性价比的角度考虑,由于物品不能切割,所以不能使用贪心算法进行计算。状态和转移方程可以根据上一题时进行修改,即最后一个物品进入背包几次,如下:

 

                 

 

通过画矩阵以及距离分析的方法,目标是能否减少枚举过程中的重复计算,简化之后的转移方程如下:

 

        

 

对于数组空间的优化,通过观察转移方程中计算的顺序,可以将一个二维问题降至一维求解,只不过这里与上面一题的区别在于计算顺序可以从前往后了,代码的修改也是只需要修改计算顺序那一部分。

 

 

 

           

 

 

 

 

 

资源下载链接为: https://pan.quark.cn/s/1bfadf00ae14 华为移动服务(Huawei Mobile Services,简称 HMS)是一个全面开放的移动服务生态系统,为企业和开发者提供了丰富的工具和 API,助力他们构建、运营和推广应用。其中,HMS Scankit 是华为推出的一款扫描服务 SDK,支持快速集成到安卓应用中,能够提供高效且稳定的二维码和条形码扫描功能,适用于商品扫码、支付验证、信息获取等多种场景。 集成 HMS Scankit SDK 主要包括以下步骤:首先,在项目的 build.gradle 文件中添加 HMS Core 库和 Scankit 依赖;其次,在 AndroidManifest.xml 文件中添加相机访问和互联网访问权限;然后,在应用程序的 onCreate 方法中调用 HmsClient 进行初始化;接着,可以选择自定义扫描界面或使用 Scankit 提供的默认扫描界面;最后,实现 ScanCallback 接口以处理扫描成功和失败的回调。 HMS Scankit 内部集成了开源的 Zxing(Zebra Crossing)库,这是一个功能强大的条码和二维码处理库,提供了解码、生成、解析等多种功能,既可以单独使用,也可以与其他扫描框架结合使用。在 HMS Scankit 中,Zxing 经过优化,以更好地适应华为设备,从而提升扫描性能。 通常,ScanKitDemoGuide 包含了集成 HMS Scankit 的示例代码,涵盖扫描界面的布局、扫描操作的启动和停止以及扫描结果的处理等内容。开发者可以参考这些代码,快速掌握在自己的应用中实现扫码功能的方法。例如,启动扫描的方法如下: 处理扫描结果的回调如下: HMS Scankit 支持所有安卓手机,但在华为设备上能够提供最佳性能和体验,因为它针对华为硬件进行了
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值