背包九讲之背包第一讲--01背包

【背包问题九讲】第一讲:01背包问题(含Java实现代码) 本文讲解是崔添翼背包九讲系列的第一讲,讲解了01背包问题,并提供了Java实现代码。01 背包问题是最基本的背包问题,它包含了背包问题中设计状态、方程的最基本思想。另外,别的类型的背包问题往往也可以转换成 01 背包问题求解。故一定要仔细体会上面基本思路的得出方法,状态转移方程的意义,以及空间复杂度怎样被优化。 阅读详情

背包九讲之背包第一讲–01背包

01背包是在M件物品取出若干件放在空间为 W 的背包里,每件物品的体积为 W1 ,W2 至 Wn ,与之相对应的价值为 P1 , P2 至 Pn 。01背包是背包问题中最简单的问题。01背包的约束条件是给定几种物品,每种物品有且只有一个,并且有权值和体积两个属性。在01背包问题中,因为每种物品只有一个,对于每个物品只需要考虑选(1)与不选(0)两种情况。如果不选择将其放入背包中,则不需要处理。如果选择将其放入背包中,由于不清楚之前放入的物品占据了多大的空间,需要枚举将这个物品放入背包后可能占据背包空间的所有情况。

那么简单来说就是:有N件物品和一个容量为 V 的背包。(每种物品均只有一件)第 i 件物品的体积是 w[i] ,价值是 v[i] 。求解将哪些物品装入背包可使价值总和最大。

为了简单理解,这里先设 f[i][j] , 这表示前 i 件物品, 背包剩余体积为j时的总价值。

现在对这个问题简单化,即有两种情况:

第一种是第 i 件不放进去,这时所得价值为: f[i-1][j] (因为第i件物品不放进去,所以说背包的剩余体积j不变,此时总价值与上一次总价值相等)

第二种是第i件放进去,这时所得价值为:f[i-1][j-w[i]]+v[i] (因为将第 i 件物品放入背包,所以此时的总价值就等于前 i-1 件物品的总价值加上第 i 件物品的价值) 这里要注意二维数组 f 里面是 j-w[i] ,因为这里的j表示的是背包的的剩余体积。(那么就有人问这样开数组会不会因有的数组没有用到而造成浪费,其实一般来说,开数组时一般往大了多开10或100个,这样占用的空间并不多,而且还可以防止数组越界所产生的中途崩溃问题,岂不是一举两得)

由此我们就可以得出这个DP问题的状态转移方程:

if(j<w[i])//此时背包剩余体积小于第i件物品的体积
    f[i][j]=f[i-1][j];//所以第i件物品无法放入背包,只能与前状态相同
else//当第i件物品可以放入背包时
    f[i][j]=max(f[i-1][j],f[i-1][j-w[i]+v[i]]);//还要考虑是否放入 
//若不放入则和上面的情形相同
//若放入则等于前i-1件物品时的总价值加上第i件物品的价值


例:在使用动态规划算法求解0-1背包问题时,使用二维数组 m[i][j] 存储背包剩余容量为 j ,可选物品为 i 、i+1 、……、n 时0-1背包问题的最优值。绘制
价值数组 v = {8, 10, 6, 3, 7, 2},
重量数组 w = {4, 6, 2, 2, 5, 1},
背包容量 V = 12时对应的 f[i][j] 数组。在这里插入图片描述

此时读者若不太理解,则可以自己手绘一下上图,亲身感受一下动态DP的过程。

完整代码如下:

#include<bits/stdc++.h>//C++万能头文件
using namespace std;
int f[1001][1001]={0};//数组一般开在主函数外(全局变量),这样不仅可以提高数组的最大长度,在遇到多个函数时还可以省去指针
int w[1001];
int v[1001];
int main()
{
    int V,N;
    scanf("%d %d",&V,&N);
    int i,j;
    for(i=1; i<=N; i++)
        scanf("%d %d",&w[i],&v[i]);//输入第i件物品的体积和价值
    for(i=1; i<=N; i++)//这里如果不懂可以调试一下,一步一步观察各个变量
    {
        for(j=0; j<=V; j++)
        {
            if(j>=w[i])
                f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i]);//状态转移方程(核心 !)
            else
                f[i][j]=f[i-1][j];
        }
    }
    printf("%d\N",f[N][V]);
    return 0;
}

01背包的这种解法的时间复杂度为 o(V*N)

此问题还可以进行优化,但初学者应先掌握这最基本的一种解法。

日后还会持续更新优化解法以及其他背包等DP问题。。。

背包九讲 有 NN 件物品和一个容量是 VV 的背包。每件物品只能使用一次。第 ii 件物品的体积是 vivi,价值是 wiwi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。 阅读详情

相关推荐

as拖动,简单,实用,类似游戏中背包物品拖动

实现类似游戏武侠风云中背包物品的拖动,基于as的库进行编写,没有使用DragManager,DragManager的特效太多,没有研究怎样去除。 本例中做到了两个面板中各自物品的拖动及互相拖动,比较实用。 以前总是基于DragManager来做,现在发现用as的startDrag也比较容易实现,大家学习交流下....

初谈背包问题——01背包

背包问题是一类经典的组合优化问题,通常涉及在限定容量的背包中选择物品,以最大化某种价值或利益。目标是选择一些物品放入背包,使得它们的总重量不超过背包容量,同时总价值最大,求出价值最大化。对于01背包问题,编者把自己的想法分享给大家,望对大家有帮助,由于本人水平有限,一些地方可能说不清楚或者错误的地方,望各位大佬指出共同进步,下一篇更新多重背包问题。,也叫滚动数组,每滚动一次,dp[j]就会更新一遍,dp[i]只记录一行的数据,的问题,并且介绍它们的优化解法,由于文章长度限制,编者将会分多篇文章进行编写。

闻道有先后,术业有专攻 689

claude使用教程

提供了三种模型:claude,codex, gemini,三种模型都共用同一个apikey, 有开发需求使用claude效果较好,知识问答等场景gemini效果会更好些,本文只提供了claude的安装方式,剩下两种按需按照以下参考链接安装下即可,安装有问题参考文档:https://www.aicodemirror.com/dashboard/official-installation/macos-linux (不需要挂梯子,自己手机号注册就好)

lichao19871216的博客 3501

【C++算法模板】背包九讲(上):01背包、完全背包、多重背包

如果按照类似于完全背包从状态转移方程式入手的角度来优化是不可行的,因为完全背包问题不会多最后一项出来,多了一个。背包,再通过二进制优化的方式把从枚举。的判定条件,最后一项会因为超出了。

qq_63586399的博客 1690

BES平台集成第三方音频算法避坑指南:以声加ENC为例,聊聊文件放置、内存分配与授权那些事

本文详细解析了在BES平台上集成声加ENC降噪算法的全流程,包括技术选型、系统架构设计、内存管理及量产授权等关键环节。特别针对BES平台的双核架构和内存限制,提供了文件放置、内存分配与授权验证的实用解决方案,帮助开发者高效实现音频算法集成。

weixin_33720956的博客 514

90. 将 SAP ABAP 内表内容本地导出成 Excel 文件

这里文件扩展名为 csv,全称是 Comma-Separated Values,意思是这种类型的文件内容,由逗号分隔。除了 ASC 之外,另一个可用的选项是 BIN,适用于 PDF,EXE 等二进制文件的导出。支持海量的输入和输出参数,我们这个简单的本地导出场景里,大部分参数都用不上。这个分隔符的添加逻辑,编写在上图红色高亮矩形框内,使用的语法是。本教程有学习者向我提问,询问如何将 ABAP 某某函数的某某输出参数的值,导出成本地 Excel 文件。把这个内表的内容,下载到本地,以本地文件的方式保存。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1743

背包九讲系列1——01背包、完全背包、多重背包

我在进行一些互联网公司的技术笔试的时候,对于我来说最大的难题莫过于最后的那几道编程题了,这对算法和数据结构有一定程度上的要求,而“动态规划”又是编程题中经常出现的算法类型,并且对于我这种没有搞过ACM竞赛的菜鸟来说,那更是非常难受。以至于很难通过笔试,所以打算好好的学习一下“动态规划”这个部分,就找到了动态规划的经典入门,背包9讲来学习和参考。背包9讲在网上也是有一定影响力的文章,是崔添翼大神的作品

yukunqi的博客 1万+

华为OD新系统机试真题 2026.5.10 - 美观的灯笼

华为OD新系统机试真题【美观的灯笼】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【美观的灯笼】

qq_45776114的博客 643

对于dd大牛《背包九讲》的总结——第一讲01背包以及其优化

背包哪九讲? 1.01背包问题——每件物品选或者不选 2.完全背包问题——每件物品可以选无限次,爱选多少次选多少次,只要背包容量够用 3.多重背包问题——每个物品选的次数上限不同且有限制 4.混合背包问题——物品很多种,每种物品的信息不同 5.二维费用背包问题——普通的背包问题可能只有重量限制,而二维可能是重量+体积限制 6.分组背包问题——各种问题分成若干组,每组只能选一件,组内物品相互排斥 7...

是个努力精啊! 941

ArcGIS实验教程——实验二十五:大型商场选址经典案例

本实验基于ArcGIS平台进行商场选址分析,综合考虑道路、居民点、停车场和已有商场四个影响因素。通过缓冲区分析建立各要素的影响范围(道路50米、居民点100米、停车场100米、已有商场500米),采用叠加分析中的相交和擦除运算确定最优选址区域。实验建立了区位评价体系,通过属性赋值(1/-1)和联合运算生成综合评价结果,并实现分级可视化显示。注意事项包括距离参数设置对结果的影响以及正确选择空间分析工具。该流程为商业选址提供了科学的GIS解决方案。

智慧空间实验室 1万+

15、运行语音识别应用:从Mac到微控制器的部署指南

本文详细介绍了如何在Mac上运行语音识别应用,并将其部署到Arduino Nano 33 BLE Sense和SparkFun Edge等微控制器设备上的完整流程。内容涵盖应用构建、设备特定的音频与输出实现、部署步骤、常见问题解决方案及进一步优化建议。通过本指南,开发者可快速实现基于TensorFlow Lite的嵌入式语音识别系统,并根据需求进行自定义修改与功能扩展。

l3m4n的博客 57

[背包九讲详解] 第一讲 01背包

背包九讲详解

wjie0309的博客 233

26、机器学习模型的成员推断攻击与隐私保护

本文探讨了机器学习模型面临的成员推断攻击及其对隐私的潜在威胁。通过使用CIFAR-10数据集,详细介绍了如何利用影子模型和攻击模型推断特定数据点是否属于模型的训练集。实验表明,即使无法直接访问模型参数和原始数据,攻击者仍能以高于随机猜测的概率进行推断,从而构成隐私风险。此外,文章还分析了实验的关键技术点,并提出了多种隐私保护建议,包括数据脱敏、差分隐私、模型正则化等方法。

coffee的博客 123

背包九讲学习笔记 第一讲 01背包

第一讲 01背包 题目 给定物品个数n,背包容量v,每个物品都有一个体积c和价值w,要求向背包中装物品使得总价值最高. 基本思路 状态表示:f(i,j)表示前i个物品试图装入一个容量为j的背包的最大价值. 边界情况:f(0,j)=0. 状态转移:f(i,j)=max(f(i-1,j),f(i,j-save[i])+value[i]). 即装或不装第i个物品 时间复杂度O...

秋叶红于二月花 4125

亚马逊爬虫实战:中国商家信息(电话)爬取

import os), # 保存图片的路径# 搜索关键词"keywords":["毛巾","衣服"],"product_number": 1000000000000000, # 分页获取数量# 和url一一对应 个数要一样"remarks": ["备注1"],# 以下内容非专业人员请勿更改,请找开发人员更改. 对应的是amazon_product_url_setting文件中名称.},

youbingchen的博客 1524

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

背包九讲-第一讲 01背包

问题 有n种物品,每种只有一件,物品具有价值和体积两个属性 一个容量为v的背包 每种物品可以选择是否放入背包中 选择合适的策略,使得背包中的物品总价值最高 思路 定义d[i][v]表示处理前i个物品,背包剩余容量为v时背包的最大价值 状态转移方程: f[i][v] = max(f[i-1][v], d[i-1][v-c[i]]+w[i]) 如果不装第i个物品,则f[i][v] = d[i...

weixin_30699235的博客 62

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

背包九讲——01背包问题

背包问题是一类经典的组合优化问题,通常涉及在限定容量的背包中选择物品,以最大化某种价值或利益。问题的一般描述是:有一个背包,其容量为C;有一组物品,每个物品有重量w和价值v。目标是选择一些物品放入背包,使得它们的总重量不超过背包容量,同时总价值最大。这个问题有两个主要变体:0/1背包问题和分数背包问题。

闻道有先后,术业有专攻 2829

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

背包九讲——背包问题求具体方案

f[i][j]的上一个状态就是从i+1转移过来的,因为我们定义从第i个物品到最后一个物品,第i+1个物品到最后一个之间的数量是不是比第i个物品到最后一个物品少。f[i+1][j]是不选第i个物品,f[i+1][j-v[i]]+w[i]是选第i个物品。因为我要在所有f[i][j]当中选择一个最大值,所以前面我管不管的先初始化为不选,往后如果背包容量大于体积,那我再看看是选了这个物品总价值是否增大,如果增大就更新,不增大就保持原来。

闻道有先后,术业有专攻 2729

背包问题(背包九讲)

背包九讲 概述 本文参考自bilibili上up主大雪菜的背包九讲专题:背包九讲专题1、背包九讲专题2 以及AcWing上的相关讲解。 背包问题代表了一类问题,即组合类的最优化问题,就是如果给我们一堆物品(元素),我们要按照某种限从中选出若干个物品(元素),求最大/最小值。 本文将将对如下的九种背包问题给出分析过程以及实现代码(提供C++和Java代码,代码链接:github) /* 1. 01背包问题 2. 完全背包问题 3. 多重背包问题 4. 混合背包问题 5. 二维费用背包问题 6. 分

weixin_42638946的博客 4934

背包九讲总结

文章目录前言一、01背包(二维分析、一维优化)1.背景2.分析3.代码二、完全背包(与01背包比较)1.背景2.分析3.代码三、多重背包(朴素、二进制优化划分、单调队列优化)1.背景2.分析3.代码四、1.背景2.分析3.代码 前言 <font color=#999AAA 根据y总的视频,总结了一下背包九讲的内容,准备好好搞一下dp问题。 一、01背包(二维分析、一维优化) 1.背景 01背包 先给定背包容积大小V,再给定物品数目N,之后根据N的值输入每个物品的体积v[i]跟价值w[i],问背

qq_52441682的博客 1768

背包九讲【进阶版】(上)

本文重新梳理了动态规划中的背包问题,包括01背包、完全背包,多重背包、混合背包和二维费用背包以及各自的优化方式。

2402_88147924的博客 1174

c++背包九讲之01背包

一、背包九讲总述 关于动态规划问题,最典型的就是背包九讲,先理解背包九讲后再总结关于动态规划的问题。 1、01背包问题 2、完全背包问题 3、多重背包问题 4、混合背包问题 5、二维费用的背包问题 6、分组背包问题 7、背包问题求方案数 8、求背包问题的方案 9、有依赖的背包问题 二、01背包问题 01背包(ZeroOnePack): 有n件物品和一个容量为C的背包, 每种物品均只有一件,第i...

weixin_42579072的博客 1163

背包九讲!!!

所以有必要将它详细的解释一下:若只考虑第i件物品的策略(放或不放),那么就可以转化为只牵扯前 i-1件物品的问题。如果放第 i 件物品,那么问题就转化为“前i-1件物品放入一个容积为 j-v[i]的背包中”,此时获得的最大价值就是 f[i-1] [j-v[i]]再加上放入第 i 件物品所获得的价值w[i].的多种情况中取最值,当k=0时,f [ i − 1 ] [ j − k ∗ c [ i ] ] + k ∗ w [ i ] 就相当于f [ i − 1 ] [ j ] ,也就是这件物品一件也不取的情况。

2402_88000128的博客 1005

[转]背包九讲

背包问题九讲 v1.0 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 第八讲 泛化物品 第九讲 背包问题问法的变化

sky_fighting的专栏 2955
下一篇: To love and to be loved
The___Flash
博客等级 码龄8年 79粉丝 223原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值