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

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

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

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

一、题目

有 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue使用md5_vuepress在线编辑文档

    vue使用md5_vuepress在线编辑文档1,需求一直在找一个好用的富文本编辑器,但是发现现在富文本已经不流行了,现在流行md所以找md编辑器找到一个好用的:mavon-editorgithub:https://github.com/hinesboy/mavonEditor2,配置main.jsimportVuefrom”vue”;importAppfrom”./App.vue”;import…

    2022年9月2日
    2
  • python数组使用(超级全面)「建议收藏」

    python数组使用(超级全面)「建议收藏」1、Python的数组分三种类型:(1)list普通的链表,初始化后可以通过特定方法动态增加元素。定义方式:arr=[元素](2)Tuple固定的数组,一旦定义后,其元素个数是不能再改变的。定义方式:arr=(元素)(2)Dictionary词典类型,即是Hash数组。定义方式:arr={元素k:v}2、下面具体说明这些数组的使用方法和技巧:(1)lis…

    2022年8月13日
    3
  • sae wpa3加密方式_WPA3:四大安全新特性技术分析

    sae wpa3加密方式_WPA3:四大安全新特性技术分析周一晚些时候,包括苹果、思科、英特尔、高通和微软等科技巨头在内的Wi-Fi联盟正式推出了新的Wi-Fi安全标准WPA3。这个标准将解决所有已知的、会影响重要标准的安全问题,同时还针对KRACK和DEAUTH等无线攻击给出缓解措施。WPA3为支持Wi-Fi的设备带来重要改进,旨在增强配置、加强身份验证和加密等问题。重要改进主要包括:防范暴力攻击、WAP3正向保密、加强公共和…

    2022年5月24日
    47
  • python vimrc[通俗易懂]

    python vimrc[通俗易懂]全局:在/etc/vim/vimrc中添加 本地:~/.vimrcsetfileencodings=utf-8,gbksetambiwidth=double“支持中文setsmartindentsetsmarttabsetexpandtabsettabstop=4setsofttabstop=4setshiftwidth=

    2022年6月13日
    26
  • import javax.servlet.http.HttpSession;异常

    import javax.servlet.http.HttpSession;异常

    2021年7月18日
    89
  • 前端如何做好seo_seo的五个步骤

    前端如何做好seo_seo的五个步骤一、合理的title、description、keywords搜索对着三项的权重逐个减小,title值强调重点即可;description把页面内容高度概括,不可过分堆砌关键词;keywords列举出重要关键词。1、titletitle,就是浏览器上显示的那些内容,不仅用户能看到,也能被搜索引擎检索到(搜索引擎在抓取网页时,最先读取的就是网页标题,所以title是否正确设置极其…

    2022年9月18日
    0

发表回复

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

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