当前位置: 首页 > news >正文

01背包问题和完全背包问题

1.首先是0-1背包问题:

        01背包问题是最简单的背包问题,无非是有不同种类的东西,选择最大价值的选法。而01背包问题和其他背包问题不同的就是,他里面一类物品只有一个,也就是说没有复数同类物品。

        因此,我们先确认集合为,前i个商品,最大体积为j时,获得的最大价值为f[i][j]。而对于第i个商品,有买和不买两种选择,不买的话:f[i][j] = f[i-1][j];,买的话:f[i][j] = f[i-1][j-v[i]] + w[i]

        因此,代码为:

for(int i = 1; i <= n; i ++ )
    {
        for(int j = 0; j <= m; j ++ )
        {
            if(v[i] <= j)
                f[i][j] =max(f[i - 1][j], f[i][j - v[i]] + w[i]);
            else
                f[i][j] = f[i - 1][j];
        }
    }

         可以使用滚动数组进行优化:因为每次更新的时候只用得到i-1,最后需要输出的也只是f[n][m],前面的其实可以不存。因此,可以使用一维数组。但这里需要注意的是,算出新一个i的不同体积限制时,体积要从大到小遍历,因为更新的时候,大的体积部分肯定需要小的体积部分的i-1的部分。因此:

        

for(int i = 1 ; i<=n ;i++)
    for(int j = m ; j>=v[i] ;j--)
    {
            f[j] = max(f[j],f[j-v[i]]+w[i]);
    }

2.而完全背包问题,则是每样物品有无数个,可以更加随意地组合。这个问题和01背包问题有挺多的不同点。

        因此要多一个循环:

for(int i = 1; i <= n; i ++ )
        for(int j = 0; j <= m; j ++ )
            for(int k = 0; k * v[i] <= j; k ++ )
                f[i][j] = max(f[i][j], f[i - 1][j - k * v[i]] + k * w[i]);//求出每一个 f[i][j]

         也可以优化:

for(int i = 1 ; i<=n ;i++)
    for(int j = v[i] ; j<=m ;j++)//注意了,这里的j是从小到大枚举,和01背包不一样
    {
            f[j] = max(f[j],f[j-v[i]]+w[i]);
    }

相关文章:

  • Vite 开发服务器漏洞
  • PC名词解释-笔记本的S0,S1,S2,S3,S4,S5状态
  • 元宇宙浪潮下,数字孪生如何“乘风破浪”?
  • SQL Server 动态构建 SQL 语句学习指南
  • Redis 数据淘汰策略深度解析
  • Text2SQL推理类大模型本地部署的解决方案
  • 物质与空:边界中的确定性,虚无中的无限可能——跨学科视角下的存在本质探析
  • 启扬RK3568开发板已成功适配OpenHarmony4.0版本
  • Faster RCNN Pytorch 实现 代码级 详解
  • Android Kotlin 中使用 MPAndroidChart 绘制优雅的曲线图:封装与优化实践
  • 学习记录-Ajax-自封装axios函数
  • 【10】Strongswan collections —— array
  • 使用HTTP提交git时,每次都要输入用户名和密码的解决方案
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第五讲)
  • 寻找重复数 - LeetCode 287 题解笔记
  • Linux 系统检测进程死锁的方法
  • 今日 GitHub 热门项目大赏,你 pick 谁?
  • 4.go语言数组
  • 1.1 计算机网络的概念
  • 基于python的4个小游戏(免费直接使用)
  • 深圳本地网站建设/深圳网站设计实力乐云seo
  • 上海网站建设 迈若/谷歌搜索引擎官网
  • 如何做网站 知乎/怎么创建公司网站
  • 网站建设公司-山而/长尾词在线挖掘
  • 如何学做网站平台/附近广告公司联系电话
  • 哪些网站可以做平面设计挣钱/应用商店app下载