代码随想录——动态规划01背包

news/2024/12/29 11:04:16/文章来源:https://www.cnblogs.com/neromegumi/p/18638532

image

暴力:每一件物品其实只有两个状态,取或者不取,所以可以使用回溯法搜索出所有的情况,那么时间复杂度就是O(2^n),这里的n表示物品数量。
所以暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!

二维dp数组01背包

  1. 确定dp数组及下标含义
    dp[i][j]表示前i件物品恰放入一个容量为j的背包可以获得的最大价值。
    此时最后返回dp[n-1][w]即可

  2. 确定递推公式
    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
    解释:从“不放入第i件物品”与“放入第i件物品的价值 + 放入前i-1件物品到容量为j-weight[i]的背包可获得的最大价值”中选最大值

  3. dp数组初始化

    1. 容量为0时,都为0
    2. 因为dp[i][j]需要用到dp[i-1][j],所以需要初始化第一行。
      当j>=weight[0]时,dp[0][j]应该是value[0];否则是0.

关于初始化,一定要和dp数组的定义吻合,否则到递推公式的时候就会越来越乱。
image

  1. 确定遍历顺序
    先遍历物品再遍历容量 或相反都可以。因为递推公式用到的都是dp[i][j]左上的元素。

代码

#include<iostream>
#include<vector>using namespace std;int main(){int M,N;cin>>M>>N;vector<int> value(M);vector<int> cost(M);for(int i=0;i<M;i++){cin>>cost[i];}for(int i=0;i<M;i++){cin>>value[i];}vector<vector<int>> dp(M,vector<int>(N+1,0));//dp[M][N]是从0到M-1个材料中选择,容量为N时的最大价值//初始化for(int j=cost[0];j<=N;j++){dp[0][j] = value[0];}for(int i=1;i<M;i++){for(int j=0;j<=N;j++){if(j<cost[i])dp[i][j] = dp[i-1][j];else dp[i][j] = max(dp[i-1][j],dp[i-1][j-cost[i]]+value[i]);}}cout<< dp[M-1][N];return 0;
}

一维dp数组01背包

二维递推公式dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
发现如果把dp[i - 1]那一层拷贝到dp[i]上,表达式完全可以是:dp[i][j] = max(dp[i][j], dp[i][j - weight[i]] + value[i]);

区别在于遍历顺序。

  1. 容量只能从大到小遍历。
    如果从小到大,上一层的dp[j]会被覆盖,导致后续计算dp[i][j-weight[i]]时使用的是这一层的dp而出现错误。如果从大到小遍历,因为递推公式不会用到
  2. 只能先遍历物品再遍历容量
    因为容量从大到小遍历,如果先遍历容量再遍历物品。算不出答案。
#include<iostream>
#include<vector>using namespace std;int main(){int M,N;cin>>M>>N;vector<int> value(M);vector<int> cost(M);for(int i=0;i<M;i++){cin>>cost[i];}for(int i=0;i<M;i++){cin>>value[i];}// 一维数组vector<int> dp(N+1,0);//初始化for(int j=cost[0];j<=N;j++){dp[j] = value[0];}//遍历顺序——容量从后往前for(int i=1;i<M;i++){for(int j=N;j>=cost[i];j--){dp[j] = max(dp[j],dp[j-cost[i]]+ value[i]);}}cout << dp[N];return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/860760.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024-2025-1 学号20241315《计算机基础与程序设计》第十四周学习总结

作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计)这个作业要求在哪里 <作业要求的链接>https://www.cnblogs.com/rocedu/p/9577842.html#WEEK14这个作业的目标 <写上具体方面>《C语言程序设计》第13-14章并完成云班课测试作业正文 https://www.cn…

2024-2025-1 20241415《计算机基础与程序设计》第十四周学习总结

2024-2025-1 20241415《计算机基础与程序设计》第十四周学习总结 作业信息这个作业属于哪个课程 2024-2025-1-计算机基础与程序设计这个作业要求在哪里 2024-2025-1计算机基础与程序设计第十四周作业这个作业的目标 自学《C语言程序设计》第13-14章作业正文 https://www.cnblog…

kubectl 命令行快速操作-2

9、对外暴露服务 参考:详解kubernetes五种暴露服务的方式 - 滴滴滴 - 博客园 前面只介绍了Nodeport方式,还有NodePort、LoadBalancer、ExternalName、Ingress方式,重点讲解Ingress方式。 nginx-ingress:GitHub - kubernetes/ingress-nginx: Ingress NGINX Controller for K…

主动式AI(代理式)与生成式AI的关键差异与影响

大型语言模型(LLMs)如GPT可以生成文本、回答问题并协助完成许多任务。然而,它们是被动的,这意味着它们仅根据已学到的模式对接收到的输入作出响应。LLMs无法自行决策;除此之外,它们无法规划或适应变化的环境。 主动式AI(代理式)的出现正是为了解决这一问题。与生成式AI…

docker之旅

物理机上部署:1 部署复杂,成本高; 会造成资源的浪费 ; 不支持跨平台部署 ;无法支持进行服务的迁移 虚拟化:1 在一台宿主机上虚拟出多台虚拟机, 虚拟机会部署一个完整的操作系统,要分配系统资源。部署缺点: 部署复杂,无法进行迁移3 虚拟化与容器对比容器直接使用的宿主…

kubernetes之旅

k8s 架构 https://kubernetes.io/核心组件ETCD 分布式高性能键值数据库,存储整个集群的所有元数据 Apiserver 集群的资源访问控制入口,提供restAPI 和安全访问控制 scheduler: 调度器,负责将业务pod调度到合适的节点上 controller manager : 控制器,确保集群 按照期望方式…

asdfasdfasdf

阿斯蒂芬 阿萨德发生的发生阿斯蒂芬 阿萨德发生的发生代发收到飞 阿斯蒂芬 撒旦法撒地方 阿萨德发生的发生 金阿奎猎杀对决菲拉斯代发件 unit main;interfaceusesWinapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,Vcl.Contro…

Blazor 渲染当前语言区小数点格式对应编辑组件

环境: 使用西班牙语文化, 组件: 表格 显示格式对的, 小数点西班牙这边是逗号(,) , 0.99 显示为 0,99 重现 编辑商品, 显示变成了0.99而不是正确的区域格式 0,99, 直接保存没事的 如果手动改了一下数字为 0.99 只要焦点变化了 就会格式化为 99 , 这个时候保存数据就出问题了 经…

两均值比较R

1. 两个均值比较校验 1.1 两独立样本均值检验 1.1.1 检验理论依据 两样本均值差: \(\bar{x}_1-\bar{x}_2\) 两总体均值差: \(\mu_1 - \mu_2\) 则两样本均值差服从正态分布: \[\overline{x}_1-\overline{x}_2\sim N(\mu_1-\mu_2,\sigma_{\overline{x}_1-\overline{x}_2}^2) …

Khronos和EMVA便携式应用程序结构

Kamaros便携式应用程序结构 Kamaros便携式应用程序结构,如图1-11所示。图1-11Kamaros便携式应用程序结构 Khronos和EMVA合作 Khronos和EMVA合作,如图1-12所示。图1-12 Khronos和EMVA合作人工智能芯片与自动驾驶

Intel oneAPI DPC++和UXL基础与对并行处理的需求

Intel oneAPI DPC++和UXL基础 1)Intel oneAPI DPC++符合SYCL 2020规范 ①统一共享内存、并行约简、工作组算法、类模板。 ②论证推理、访问优化、扩展互操作性等。 2)UXL统一加速基础 ①加速计算开放生态系统。 ②工具和库。 ③编译器和开发工具。 ④API和规范。 3)Khronos和…

《智能汽车传感器:原理设计应用》《AI芯片开发核心技术详解》两本专著书推荐

两本书推荐《AI芯片开发核心技术详解》、《智能汽车传感器:原理设计应用》由清华大学出版社资深编辑赵佳霓老师策划编辑的新书《AI芯片开发核心技术详解》已经出版,京东、淘宝天猫、当当等网上,相应陆陆续续可以购买。该书强力解析AI芯片的核心技术开发,内容翔实、知识点新…