完全背包 初学篇「建议收藏」

完全背包 初学篇「建议收藏」完全背包 初学

大家好,又见面了,我是你们的朋友全栈君。

关于更多背包的内容可以在我的“背包”类别中查看

一、题目

有 n 种物品和一个容量为 m 的背包,每种物品都有无限件可用。放入第 i 种物品的费用是
v i ,价值是 W i 。求解:将哪些物品装入背包,可使这些物品的耗费的费用总和不超过背包
容量,且价值总和最大。

二、基本思路

完全背包和01背包的不同之处就是在于,01背包每个物品只有一件,而完全背包每个物品有无限件。我们还是以二维数组来进行思考,我们在01背包中每次更新值时面临的决策是要不要放第i件物品,而在完全背包,我们需要抉择的便是,我们此时要放第i件物品几件?(0——最多能放的件数)

状态转移方程:F[i,j]=max{F[i-1,j],F[i-1,j-k*wi]+k*vi}

总的复杂度可以认为是 O(mn ni=0m/vi ) 这个复杂度是非常大的,我们还要改进这个复杂度。

三、简单的优化

若两件物品 i , j 满足 v i ≤ v j且 w i ≥ w j ,则将可以将物品 j 直接去掉,不用考虑。这个优化方式并不能满足最坏的情况,或许部分题目可以用这个优化卡过时间,故在此处并不做过多描述。

四、更好的优化

考虑到第 i 种物品最多选 m/v i 件,于是可以把第 i 种物品转化为 m /v i 件费用及价值均不变的物品,然后求解这个 01 背包问题。而这样不并不能优化太多的复杂度。
这时我们可以通过二进制的思想再次进行优化,通过几件相同的物品捆绑在一起,再相加我们可以得到每一个值(比如,此时我们第一件物品(就叫他a)我们最多可以放5件,那么我们把几个a捆绑一下,第一份就一个a,第二份两个a,第三份四个a。我们就可以发现这几份之间互相组合是一定可以完成1-5件a放入背包的情况的遍历的)这样一来就把每种物品拆成 O(log ⌊V /C i ⌋) 件物品,是一个很大的改进。
当然这依然不是最好的优化,我们依然不采用。

五、O(V N ) 的算法

还是以01背包的方向入手,01背包我们最终优化到的方法是使用一维数组,我们在进行遍历的时候是从后往前遍历的,为什么?我们比较的是还没装入此物品的状态,所以说,从后往前可以防止数据变化,而这个时候我们不就需要让数据变化起来吗,我们需要的就是已经选入第i件物品的子结果,(比如我们比较的是是不是要放两个第一件物品,我们要比较的是什么?是放入一件第一件物品的价值和放两件第一件物品的价值)所以这个时候我们只需要把第二个循环从前往后遍历就可以了。

CODE:

#include<cstdio>
#include<algorithm>
using namespace std;
int w[300],c[300],f[300010];
int V,n;
int main()
{
    scanf("%d%d",&V,&n);
    for(int i=1; i<=n; i++)
    {
        scanf("%d%d",&w[i],&c[i]);
    }
    for(int i=1; i<=n; i++)
        for(int j=w[i]; j<=V; j++)//注意此处,与0-1背包不同,这里为顺序,0-1背包为逆序
            f[j]=max(f[j],f[j-w[i]]+c[i]);
    printf("max=%d\n",f[V]);
    return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150680.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 详解布隆过滤器原理,及分布式运用方法_布隆过滤器最小误差

    详解布隆过滤器原理,及分布式运用方法_布隆过滤器最小误差1.什么是布隆过滤器布隆过滤器是一个叫“布隆”的人提出的,本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilisticdatastructure)。它本身是一个很长的二进制向量,特点是高效地插入和查询,可以用来确定“某一条数据一定不存在或者可能存在一个集合中”。相比于传统的List、Set、Map等数据结构,它更高效、占用空间更少(因为是个二进制的向量),但是缺点是其返回的结果是概率性的,而不是确切的。2.布隆过滤器数据结构布隆过滤器是一个bit向量或者

    2022年10月6日
    4
  • kaptcha配置java_kaptcha 配置

    kaptcha配置java_kaptcha 配置问题所在:这一段配置,不要写在SpringMVC文件中,要写在Spring配置文件!no105,179,90red2508090code4宋体,楷体,微软雅黑异常信息:十二月19,20176:22:48下午org.apache.jasper.servlet.TldScannerscanJars信息:AtleastoneJARwasscannedforTLDsy…

    2022年6月18日
    33
  • 【Linux + Makefile】简单实用的Makefile模板来了

    【Linux + Makefile】简单实用的Makefile模板来了今天给大家介绍一个简单实用的Makefile模板,也可以当做学习Makefile核心内容的范例,里面都有详细的注释,清晰明了。这个Makefile主要解决以下需求:#######################################################################################需求:#1.编译输出的所有文件均放在一个outp…

    2022年6月14日
    34
  • tpshop带微分销_TPshop分销商城的分销模式

    tpshop带微分销_TPshop分销商城的分销模式TPshop针对不同的应用场景提供了多款微商城模板,今天我们一起来看看TPshop分销系统支持哪些分销模式,如何促进分销渠道的扩展和分销商管理,是否支持三级分销?推客模式:是微商城系统提供的最基础的一种分销模式,即以粉丝为中心、以社交分享为主要推广裂变方式、以佣金结算为激励手段的分销。推客模式采取的是“无限级分销、三级分佣”的模式,也就是每一个推客都可以推荐发展下一级推客,佣金的计算从直接完成销售…

    2022年5月13日
    37
  • 如何反编译小程序的源码(微信小程序反编译工具)

    网易Mumu模拟器安装下载地址:http://mumu.163.com/360/ 下载完安装包后直接安装 打开模拟器安装微信、RE文件管理器设置Root权限打开RE文件管理器,提示请求超级用户访问权限,选择允许到此准备工作完成。打开微信,然后打开小程序,获取小程序编译包先打开微信 搜索微博小程序打开 打开RE文件管理 按照/data/data/com.tencent.mm/MicroMsg/80b34bca4945f…

    2022年4月18日
    56
  • 支持向量机的原理

    一、什么是支持向量机  支持向量机(supportvectormachine,简称SVM)是一种基于统计学习理论的新型学习机,是由前苏联教授Vapnik最早提出的。与传统的学习方法不同,支持向量机是结构风险最小化方法的近似实现。这个归纳原理是基于这样的事实,学习机器在测试数据上的误差率(即泛化误差率)以训练误差率和一个依赖于Vc维数(Vapnik-Chervonenkisdimensio…

    2022年4月5日
    82

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号