01 背包

文章目录

前言

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

代码

二维的直接的版本

cpp 复制代码
#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 ,有点像是左脚踩右脚,然后就能起飞的感觉。

一维优化之后的版本

cpp 复制代码
#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;
}

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

相关推荐
l1t几秒前
对clickhouse给出的二分法求解Advent of Code 2025第10题 电子工厂 第二部分的算法理解
数据库·算法·clickhouse
Tisfy3 分钟前
LeetCode 3315.构造最小位运算数组 II:位运算
算法·leetcode·题解·位运算
YuTaoShao16 分钟前
【LeetCode 每日一题】1292. 元素和小于等于阈值的正方形的最大边长
算法·leetcode·职场和发展
Remember_99317 分钟前
【数据结构】深入理解Map和Set:从搜索树到哈希表的完整解析
java·开发语言·数据结构·算法·leetcode·哈希算法·散列表
浅念-18 分钟前
C++第一课
开发语言·c++·经验分享·笔记·学习·算法
charlie11451419122 分钟前
现代嵌入式C++教程:对象池(Object Pool)模式
开发语言·c++·学习·算法·嵌入式·现代c++·工程实践
燃于AC之乐33 分钟前
我的算法修炼之路--8——预处理、滑窗优化、前缀和哈希同余,线性dp,图+并查集与逆向图
算法·哈希算法·图论·滑动窗口·哈希表·线性dp
格林威44 分钟前
多相机重叠视场目标关联:解决ID跳变与重复计数的 8 个核心策略,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·计算机视觉·分类·工业相机
郝学胜-神的一滴1 小时前
深入理解网络分层模型:数据封包与解包全解析
linux·开发语言·网络·程序人生·算法
永远都不秃头的程序员(互关)1 小时前
【K-Means深度探索(九)】K-Means与数据预处理:特征缩放与降维的重要性!
算法·机器学习·kmeans