常见背包问题

2023-05-16

一.前言

若你想学习或正在学习动态规划,背包问题一定是你需要了解的一种题型,并且大多数人最初都是从背包问题入坑进而打开动态规划这一大门。背包问题分为多种,你可以先掌握最常见的主要是三类:01背包、完全背包、多重背包

二.分析背包问题

1)01背包

在考虑一个物品时(从目标容器到物品大小容器考虑(保证只放一次)),放入当前物品后,所剩空间只能考虑其他物品

★状态:考虑了前i个物品,大小为j的容器能放入的最大价值的商品

转移方程:f[i][j]=max(f[i-1][j],f[i-1][j-V[i]])+W[i])

转移方程:dp[j]=max(dp[j-V[i]],dp[j]])(注:等号右边的dp为上个循环的结果,即考虑当前物品前面的所有物品的结果)

2)多重背包

在考虑一个物品时,将放不同个数看成不同物品,即可转化为01背包问题

3)完全背包

在考虑一个物品时(从物品大小容器到目标容器考虑(保证应放尽放)),放入当前物品后所剩空间只能考虑其他物品

三.例题

1)题目

01背包
n 件物品和一个容量是 v 的背包。每件物品只能使用一次。
i 件物品的体积是 v i,价值是 w i
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

代码

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int v[N]; //每个物品的体积
int w[N]; //每个物品的价值
int f[N][N]; //状态转移方程,上面有详细解释
int main(){
    int n,m;
    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]); //已经把f[i][j]赋值为f[i - 1][j]了,现在就可以直接用f[i][j]了
        }
    }
    printf("%d",f[n][m]);
    return 0;
}

2)题目

n种物品和一个容量是v的背包,每种物品都有无限件可用。
i 种物品的体积是 v i,价值是 w i
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

代码

#include <iostream>

using namespace std;

const int N = 1100;
int n, m;
int v[N], w[N];
int f[N][N];

int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= n; i ++ ) cin >> v[i] >> w[i];
    for (int i = 1; i <= n; i ++ ) {
        for (int j = 1; j <= m; j ++ ) {
            f[i][j] = f[i - 1][j];
            for (int k = 1; k <= j / v[i]; k ++ ) {
                f[i][j] = max(f[i][j], f[i - 1][j - k * v[i]] + k * w[i]);
            }
        }
    }
    cout << f[n][m] << endl;
    return 0;
}

3)题目

n 种物品和一个容量是 v 的背包。
i 种物品最多有 s i 件,每件体积是 v i,价值是 w i
求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。
输出最大价值。

代码

#include <iostream>
#include <algorithm>

using namespace std;
const int N = 110;

int v[N], w[N], s[N];
int f[N][N];
int n, m;

int main(){
    cin >> n >> m;
    for(int i = 1; i <= n; i ++) cin >> v[i] >> w[i] >> s[i];

    for(int i = 1; i <= n; i ++){//枚举背包
        for(int j = 1; j <= m; j ++){//枚举体积
            for(int k = 0; k <= s[i]; k ++){
                if(j >=  k * v[i]){
                    f[i][j] = max(f[i][j], f[i - 1][j - k * v[i]] + k * w[i]);
                }
            }
        }
    }

    cout << f[n][m] << endl;

    return 0;
}

~感谢观看❥(^_-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

常见背包问题 的相关文章

  • GPS数据包格式+数据解析

    GPS数据包格式 43 数据解析 一 全球时区的划分 xff1a 每个时区跨15 经度 以0 经线为界向东向西各划出7 5 经度 xff0c 作为0时区 即0时区的经度范围是7 5 W 7 5 E 从7 5 E与7 5 W分别向东 向西每1
  • 在C#中使用libcurl库

    几乎在所有的linux发行版中 xff0c 默认都是包含有libcurl库的 那么 xff0c libcurl是使用C开发的 xff0c 自然 xff0c 当你用C或C 43 43 使用libcurl库的时候很方便 但是 xff0c 如果你
  • Linux下chrony授时监测脚本

    1 背景概述 Linux下基于gpsd 43 chrony授时 xff0c 在有些情况下会存在收敛慢或者参考时间选择错误问题 xff0c 因此需要授时监测脚本进行监测 xff0c 便于在异常时候发现并处理 2 gpsd 43 chrony授
  • 关于linux下shell输出^M特殊字符的处理

    shell中echo输出时 M特殊字符的处理 今天在csdn论坛看一网友发了一个帖子 xff1a https bbs csdn net topics 392668752 post 403986636 xff0c 我很好奇 xff0c 于是将
  • VS2010(VS2017)+Boost_1_68_0环境搭建

    文 Seraph 一 下载 首先从Boost下载官网下载源码 xff0c 当然你也可以下载编译好的库文件直接用 我下载的是boost 1 68 0 zip 解压到某个目录下 xff0c 我解压到了D盘根目录 xff1a E boost 1
  • 2.gstreamer USB摄像头RTSP推流

    目录 1 操作系统版本 2 使用gstreamer播放mp4文件 3 采集USB摄像头视频源 xff0c 并RTSP推流 4 使用RTSP播放器播放 5 注意事项 1 操作系统版本 使用的虚拟机加ubuntu 20 04 2 使用gstre
  • 3.gstreamer UDP推流RTP及拉流播放

    目录 1 将H264数据流打包为RTP包 xff0c 然后UDP推流 2 UDP client拉流 xff0c 然后RTSP传输 3 easyplayer rtsp exe播放器播放RTSP数据流 将H264打包为RTP包 xff0c 然后
  • 靶机渗透练习80-Momentum:1

    靶机描述 靶机地址 xff1a https www vulnhub com entry momentum 1 685 Description Info easy medium 一 搭建靶机环境 攻击机Kali xff1a IP地址 xff1
  • 靶机渗透练习81-Momentum:2

    靶机描述 靶机地址 xff1a https www vulnhub com entry momentum 2 702 Description Difficulty mediumKeywords curl bash code review T
  • STM32F407单片机上开发MODBUS RTU 多主站程序(二)

    STM32F407单片机上开发MODBUS RTU 多主站程序 xff08 一 xff09 STM32F407单片机上开发MODBUS RTU 多主站程序 xff08 二 xff09 前面一篇文章 STM32F407单片机上开发MODBUS
  • 靶机渗透练习82-The Planets:Mercury

    靶机描述 靶机地址 xff1a https www vulnhub com entry the planets mercury 544 Description Difficulty Easy Mercury is an easier box
  • 靶机渗透练习83-The Planets:Venus

    靶机描述 靶机地址 xff1a https www vulnhub com entry the planets venus 705 Description Difficulty Medium Venus is a medium box re
  • 靶机渗透练习84-The Planets:Earth

    靶机描述 靶机地址 xff1a https www vulnhub com entry the planets earth 755 Description Difficulty Easy Earth is an easy box thoug
  • 靶机渗透练习85-HackathonCTF 1

    靶机描述 靶机地址 xff1a https www vulnhub com entry hackathonctf 1 591 Description N A 一 搭建靶机环境 攻击机Kali xff1a IP地址 xff1a 192 168
  • 靶机渗透练习87-IA:Keyring (1.0.1)

    靶机描述 靶机地址 xff1a https www vulnhub com entry ia keyring 101 718 Description Difficulty IntermediateGoal Get the root shel
  • 靶机渗透练习86-HackathonCTF 2

    靶机描述 靶机地址 xff1a https www vulnhub com entry hackathonctf 2 714 Description Difficulty Easy This is a basic level BootToR
  • 靶机渗透练习89-IA:Nemesis (1.0.1)

    靶机描述 靶机地址 xff1a https www vulnhub com entry ia nemesis 101 582 Description Difficulty Intermediate to HardGoal Get the r
  • 靶机渗透练习90-Grotesque:1.0.1

    靶机描述 靶机地址 xff1a https www vulnhub com entry grotesque 101 658 Description get flags difficulty medium about vm tested an
  • 靶机渗透练习91-Grotesque:2

    靶机描述 靶机地址 xff1a https www vulnhub com entry grotesque 2 673 Description get flags difficulty medium about vm do not touc
  • 靶机渗透练习92-Grotesque:3.0.1

    靶机描述 靶机地址 xff1a https www vulnhub com entry grotesque 301 723 Description get flags difficulty medium about vm tested an

随机推荐

  • 什么是RTK?GPS导航和RTK的基本原理有什么不同?

    极飞科技XAG在 2015 年开始自营作业 xff0c 当时使用的是单点 GPS xff0c 遇到了各种罗盘干扰 航迹偏移 起降需人工干预等问题 xff1b 2015 年下半年开始做 RTK 相关的研发 xff0c 努力实现全自主飞行 极飞
  • 靶机渗透练习93-hacksudo:1.0.1

    靶机描述 靶机地址 xff1a https www vulnhub com entry hacksudo 101 650 Description N A This works better with VirtualBox rather th
  • 靶机渗透练习94-hacksudo:2 (HackDudo)

    靶机描述 靶机地址 xff1a https www vulnhub com entry hacksudo 2 hackdudo 667 Description N A This works better with VirtualBox ra
  • 靶机渗透练习95-hacksudo:3

    靶机描述 靶机地址 xff1a https www vulnhub com entry hacksudo 3 671 Description This box should be easy This machine was created
  • 靶机渗透练习96-hacksudo:Thor

    靶机描述 靶机地址 xff1a https www vulnhub com entry hacksudo thor 733 Description Box created by vishal Waghmare This box should
  • 靶机渗透练习97-hacksudo:ProximaCentauri

    靶机描述 靶机地址 xff1a https www vulnhub com entry hacksudo proximacentauri 709 Description Box created by hacksudo team member
  • 靶机渗透练习98-hacksudo:L.P.E.

    靶机描述 靶机地址 xff1a https www vulnhub com entry hacksudo lpe 698 Description Box created by hacksudo team members mahesh paw
  • 靶机渗透练习99-hacksudo:FOG

    靶机描述 靶机地址 xff1a https www vulnhub com entry hacksudo fog 697 Description This box should be easy This machine was create
  • 通过Python调用OpenMV识别小球获取坐标

    OPenMV介绍 OpenMV是基于Python的嵌入式机器视觉模块 xff0c 目标是成为机器视觉界的 Arduino 它成本低易拓展 xff0c 开发环境友好 xff0c 除了用于图像处理外 xff0c 还可以用Python调用其硬件资
  • 基于HAL库的STM32串口中断接收16进制数据

    最近 xff0c 要弄Lora组网 xff0c 采集温湿度通过网关和ESP8266数据上传服务器 xff0c Lora的库采用hal编写 xff0c 因此要改用Hal库编写程序 ESP8266的串口中断是基于标准库编写的 xff0c 因此
  • 模仿标准库函数,利用UART_IT_RXNE和UART_IT_IDLE两个标志,写了一个hal库串口接收的程序,只用到在中断写

    突然间发现 xff0c 原来的标准库的程序 xff0c 改成hal库 xff0c 把hal库里的一些规则 形式掌握好 xff0c 只需要做一些小的改动即可 这里是串口2的接收中断的代码 xff0c 用串口1实现这个功能 xff0c 修改一下
  • RTK+GPS提高定位精度原理解析(一个小白写给另一个小白系列)

    目录 GPS定位原理回顾 RTK基本概念 RTK组成 RTK传输差分示意 RTK数据链接 坐标转换 RTK应用 后记 我们在上一篇文章导航定位系统的原理解析 xff08 一个小白写给另一个小白 xff09 中跟大家介绍了GPS定位的基本原理
  • 项目管理风险把控:三点估算法

    施工时间划分为乐观时间 最可能时间 悲观时间 乐观时间 也就是工作顺利情况下的时间为a 最可能时间 最可能时间 xff0c 就是完成某道工序的最可能完成时间m 悲观时间 最悲观的时间就是工作进行不利所用时间b 活动历时均值 或估计值 61
  • Git中 fork, clone,branch之前的区别你真的都了解了吗

    一 是什么 fork fork xff0c 英语翻译过来就是叉子 xff0c 动词形式则是分叉 xff0c 如下图 xff0c 从左到右 xff0c 一条直线变成多条直线 转到git仓库中 xff0c fork则可以代表分叉 克隆 出一个
  • 进入计算机专业学习的一些体会和思考以及今后的学习规划

    一 前言 这篇文章 xff0c 我分享了刚刚进入计算机专业学习的一些体会和思考以及今后的学习规划 xff0c 今后计划在CSDN进行学习上的反馈 xff0c 欢迎大家一起交流 xff0c 有大佬看到多多指教 x1f64f 二 体会与思考 在
  • ▲什么是类?类有什么作用?

    目录 一 什么是类 xff1f 二 类与对象是什么关系 xff1f 三 类和结构体有什么区别呢 xff1f 四 如何创建一个类 五 如何创建一个类的对象 1 对象的创建 2 创建对象的初始化 1 默认构造函数 2 普通构造函数 3 复制构造
  • 【STL】vector容器如何使用?

    文章目录 前言vector的理解vector的成员类型vector的创建vector的迭代器vector的容量vector元素访问vector的元素修改 前言 上篇博客简述了string类 xff0c 实际上就是一个用来装字符的容器 xff
  • 2022/4/9-蓝桥杯C++B组题解-G题-积木画

    宽为1 1种 xff1e a 1 61 1 宽为2 2种 xff1e a 2 61 2 宽为3 先排最左边2列 种数a 2 避免重复情况下 xff0c 排最右边1列 钟数1 这个情况种数a 2 1 61 2 先排最左边1列 种数a 1 避免
  • 动态规划算法

    一 前言 动态规划是一种常用的算法 xff0c 在算法领域十分重要 xff0c 但对于新手来说 xff0c 理解起来有一定的挑战性 xff0c 这篇博客将明确步骤来一步一步讲解动态规划到底该如何理解与运用 二 解析动态规划算法 1 特点 把
  • 常见背包问题

    一 前言 若你想学习或正在学习动态规划 xff0c 背包问题一定是你需要了解的一种题型 xff0c 并且大多数人最初都是从背包问题入坑进而打开动态规划这一大门 背包问题分为多种 xff0c 你可以先掌握最常见的主要是三类 xff1a 01背