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

01背包-一维dp数组学习笔记

01背包-一维dp数组学习笔记

https://blog.csdn.net/qq_44653420/article/details/126973071?spm=1001.2014.3001.5501

一、一维dp数组概述

 在使用二维数组的时候,递推公式:dp[i][j] = max(dp[i - 1][j],dp[i][j - weight[i]] + value[i]);

如果把dp[i - 1]层拷贝到dp[i]上,表达式变成:dp[i][j] = max(dp[i][j],dp[i][j - wight[i]] + value[i]);

如果使用一维数组dpj:表示上一层可以重复利用,直接拷贝到当前层

二、动态规划实现

  • 确定dp数组的含义

在一维dp数组中,dp[j]表示容量为j的背包所容纳物品的最大价值

  • 确定一维dp数组的递推公式

dp[j]此时由两种状态推导出来:不放物品i,放物品i

对于不放物品i,那么此时的dp[j]直接就是上一层的dp[j]拷贝而来,如果存放物品i,那么此时的dp[j]表示为dp[j - weight[i]] + value[i],意思就是容量为j -物品i重量的背包中的价值加上物品i的价值

dp[j] = max(dp[j],dp[j - weight[i]] + value)

  • 初始化一维数组

    dp[j]表示的是容量为j的背包所具有的最大价值,那么dp[0] = 0,对于非0下标的dp数组如何初始化:每次dp[i]缺的是最大的价值,所以每一个dp[i]初始化成所有物品的最小价值,由于每一个物品的价值都是大于0的,所以干脆全部初始化为0

  • 确定一维dp数组的遍历顺序

     for(int i = 0; i < weight.size(); i++)
     {
         for(int j = bagWeight; j >= weight[i];j--)
         {
             // 先遍历物品 在遍历背包  对于每一种物品 放进不同的背包
             dp[j] = max(dp[j],dp[j - weight[i]] + value[i]);
         }
     }
    

    二维dp数组遍历背包的时候,背包的容量是从小到大开始遍历的,但是一维dp数组遍历背包的时候,背包容量是从大到小遍历的。

    倒序遍历的目的是为了物品i只被放入背包一次.

    另外,一维dp数组必须先遍历物品,在遍历背包,每一个dp[j]就只会放入一个物品,也就是背包中只放入一个物品。

  • 代码实现


void func()
{
    vector<int> weight = {1,3,4};
    vector<int> value = {15,20,30};
    int bagWeight = 4;

    // 初始化dp数组
    vector<int>  dp(bagWeight + 1,0);// 全部初始化0

    for(int i = 0; i < weight.size(); i++)
    {
        // 先遍历物品

        for(int j = bagWeight; j >= weight[i]; j--)
        {
            dp[j] = max(dp[j],dp[j - weight[i]] + value[i]);
        }
    }

    cout<<dp[bagWeight]<<endl;
}


相关文章:

  • Rebex Syslog for.NET R6.6,Adds support for multicast addresses
  • day02-Java基础-注释,关键字,字面量,变量,数据类型,标识符,键盘录入,IDEA相关
  • 免密登录跳板机和linux服务器
  • HashMap原理硬核分析,细到每一行代码!
  • STK12与Python联合仿真(三):分析星座覆盖性能
  • 基于OpenHarmony/HarmonyOS操作系统的ArkUI框架深入学习——开篇1
  • WebSocket| Netty netty-websocket-spring-boot-starter
  • C语言for循环结构经典练习
  • 【老生谈算法】matlab实现元胞自动机算法源码——元胞自动机
  • wireshark协议或者协议内容解码异常
  • nginx部署vue项目(包括一个nginx部署多个vue项目)
  • 【py】[打包exe]用auto-py-to-exe将py程序打包为exe文件
  • 【数据库迁移系列】使用pgloader将数据从MySQL迁移到openGauss的最佳实践
  • 广和通携智慧金融解决方案惊艳亮相紫光展锐2022金融支付生态论坛
  • 安装Java环境
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • EventListener原理
  • Java读取Properties文件的六种方法
  • js
  • laravel with 查询列表限制条数
  • Next.js之基础概念(二)
  • Wamp集成环境 添加PHP的新版本
  • 工程优化暨babel升级小记
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 爬虫模拟登陆 SegmentFault
  • 普通函数和构造函数的区别
  • 无服务器化是企业 IT 架构的未来吗?
  • 学习Vue.js的五个小例子
  • 再次简单明了总结flex布局,一看就懂...
  • gunicorn工作原理
  • raise 与 raise ... from 的区别
  • 积累各种好的链接
  • 整理一些计算机基础知识!
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # 数论-逆元
  • #HarmonyOS:基础语法
  • #Linux(Source Insight安装及工程建立)
  • (1)bark-ml
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (分布式缓存)Redis哨兵
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (顺序)容器的好伴侣 --- 容器适配器
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net 流——流的类型体系简单介绍
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .考试倒计时43天!来提分啦!
  • @Controller和@RestController的区别?
  • @德人合科技——天锐绿盾 | 图纸加密软件有哪些功能呢?