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

01 背包

文章目录

  • 前言
  • 代码
  • 思路

前言

总是感觉有点没有完全懂,但是说起来的时候好像又懂一点点,就是我现在的状态。

代码

二维的直接的版本

#include<iostream>
#include<algorithm>using namespace std;const int N = 1010;
int f[N][N];
int v[N],w[N];
int n,m;int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d%d",&v[i],&w[i]);}for(int i=1;i<=n;i++){for(int j=0;j<=m;j++){f[i][j]=f[i-1][j];if(j>=v[i]){f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);}}}printf("%d\n",f[n][m]);return 0;
}

思路

我们把二维的优化为一维的数组的方法就是滚动数组,因为我们计算当前这个数组的元素的答案的时候,只用到了前面一个元素的数值,有点像斐波那契数列,每次只用到了前面两个数字来求和,这里甚至更加简单,只用了前面一个数字。

另外为什么 j 那一层优化之后要从大到小枚举呢,是因为,假设我们从小到大来进行枚举,枚举的答案一定是当前层的答案,好吧,其实不是很理解,算了先记住吧,就是假设想要优化为一维的,那就需要在枚举体积的时候从最大的体积枚举到当前商品的体积,枚举到当前商品的体积很好理解,假设小于当前商品的体积,背包放不下该物品。

难怪看到弹幕刷 orz ,我之前一直难以理解,现在突然懂了,就是一个自己很难理解清楚的东西,有一个人可以很清楚地,很细致地讲解出来,这确实很厉害,很值得敬佩。虽然我还是有点点没理解清楚。

滚动数组的意思是,用一个空间是 2 的数组,比如说 a[0] 和 a[1] ,然后 0 调用 1 ,然后 1 调用 0 ,然后 0 调用 1,然后 1 调用 0 ,有点像是左脚踩右脚,然后就能起飞的感觉。

一维优化之后的版本

#include<iostream>
#include<algorithm>using namespace std;const int N=1010;
int n,m;
int v[N],w[N];
int f[N];int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%d%d",&v[i],&w[i]);}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]);}}printf("%d\n",f[m]);return 0;
}

写到这里突然有点顿悟为什么体积要从到到小枚举了,假设我们从小到大进行枚举,那么每次算的是一个比较小的数值的答案,我们可以确定那个比较小的答案就是最大值吗,是这个意思吗。好像不是这么回事,算了,不想了。就这样吧。

http://www.lryc.cn/news/514142.html

相关文章:

  • QT-------------多线程
  • 【JVM】深入了解Java虚拟机-------内存划分、类加载机制、垃圾回收机制
  • k8s部署juicefs
  • 【ArcGIS微课1000例】0136:制作千层饼(DEM、影像、等高线、山体阴影图层)
  • Ajax数据爬取
  • 快速上手大模型的对话生成
  • DateTimeExtensions:一个轻量C#的开源DateTime扩展方法库
  • 题解:监控屏幕调整问题
  • C语言----指针
  • 树莓派之旅-在wsl-x86-64 上进行树莓派的交叉编译
  • nature reviews genetics | 需要更多的针对不同种族的癌症基因组图谱研究,促进精准治疗和维护治疗公平权益
  • 代码随想录算法训练营day18
  • Kafka安全优化文档:漏洞修复到安全加固
  • Markdown如何添加任务列表-复选框的添加
  • 基于下垂控制的构网变换器功率控制【微电网变流器】【Simulink】
  • AI定义汽车/跨域融合/整车智能,汽车智能化2.0时代新机会来了
  • (leetcode算法题)10. 正则表达式匹配
  • SpringCloudAlibaba实战入门之Sentinel服务降级和服务熔断(十五)
  • 使用爬虫技术获取网页中的半结构化数据
  • 2025/1/1 路由期末复习作业二
  • OpenCV-Python实战(13)——图像轮廓
  • javascript变量
  • 在K8S中,如何查看kubelet组件的日志?
  • android studio android sdk下载地址
  • Fetch处理大模型流式数据请求与解析
  • FPGA自学之路:到底有多崎岖?
  • 从0到机器视觉工程师(二):封装调用静态库和动态库
  • [极客大挑战 2019]Knife1
  • 【在Python中生成随机字符串】
  • 【three.js】场景搭建