第四十四章 动态规划——背包问题模型(一)

news2024/9/25 17:16:59

第四十四章 动态规划——背包问题模型(一)

  • 一、模型概述
  • 二、模型变形
    • 1、AcWing 423. 采药
      • (1)问题
      • (2)分析
      • (3)代码
    • 2、AcWing 1024. 装箱问题
      • (1)问题
      • (2)分析
      • (3)代码
    • 3、AcWing 1022. 宠物小精灵之收服
      • (1)问题
      • (2)分析
      • (3)代码
    • 4、AcWing 278. 数字组合
      • (1)问题
      • (2)分析
      • (3)代码
    • 5、AcWing 1023. 买书
      • (1)问题
      • (2)分析
      • (3)代码
    • 6、AcWing 1021. 货币系统
      • (1)问题
      • (2)分析
      • (3)代码

一、模型概述

对于背包问题而言,我们还有很多细小的分类,比如01背包问题,完全背包问题,多重背包问题,二维费用背包问题,分组背包问题等等,这些常用的背包问题作者在之前的文章中都进行过详细地讲解。

传送门:
01背包问题
完全背包问题
多重背包问题
分组背包问题
二维费用背包问题

二、模型变形

1、AcWing 423. 采药

(1)问题

在这里插入图片描述

(2)分析

这道题就是一个很简单的01背包问题,这里就不过多讲解了,直接套用模型即可。

(3)代码

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1100;
int f[N];
int a[N],b[N];
int n,m;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",a+i,b+i);
    }
    for(int i=1;i<=m;i++)
    {
        for(int j=n;j>=0;j--)
        {
            if(j>=a[i])
                f[j]=max(f[j],f[j-a[i]]+b[i]);
        }
    }
    cout<<f[n]<<endl;
    return 0;
}

2、AcWing 1024. 装箱问题

(1)问题

在这里插入图片描述

(2)分析

这道题其实也是一个非常明显的01背包问题,只不过这道题的体积和价值是一样的,而且我们需要对题目最后的问题进行转化,最小剩余体积其实就是总体积减去能装的最大体积。

(3)代码

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e4+10;
int a[N],f[N];
int n,v;
int main()
{
    cin>>v>>n;
    for(int i=1;i<=n;i++)scanf("%d",a+i);
    for(int i=1;i<=n;i++)
    {
        for(int j=v;j>=0;j--)
        {
            if(j>=a[i])
                f[j]=max(f[j],f[j-a[i]]+a[i]);
        }
    }
    cout<<v-f[v]<<endl;
    return 0;
}

3、AcWing 1022. 宠物小精灵之收服

(1)问题

在这里插入图片描述

(2)分析

这道题是一个很明显的二维费用背包问题,这个题目作者在之前的文章中进行过详细地讲解,如果有对该问题感到疑惑的读者可以去看一看作者之前的文章。

AcWing 1022. 宠物小精灵之收服

(3)代码

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1010,M=510,K=110;
int f[N][M];
int a[K],b[K];
int n,m,k;
int main()
{
    cin>>n>>m>>k;

    for(int i=1;i<=k;i++)scanf("%d%d",a+i,b+i);

    for(int i=1;i<=k;i++)
        for(int j=n;j>=0;j--)
            for(int q=m;q>=0;q--)
                if(j>=a[i]&&q>b[i])
                    f[j][q]=max(f[j-a[i]][q-b[i]]+1,f[j][q]);
    int tmp=m;
    if(f[n][m])
    {
        while(f[n][m]&&f[n][m]==f[n][tmp])tmp--;
        cout<<f[n][m]<<" "<<m-tmp<<endl;
    }
    else cout<<0<<" "<<tmp<<endl;
    return 0;
}

4、AcWing 278. 数字组合

(1)问题

在这里插入图片描述

(2)分析

这道题其实看上去和我们的01背包问题是非常相似的。如果这道题我们转化为01背包问题的话,描述如下:
给很多个物品和体积,然后从中任取几个物品能够恰好填满背包的方案数。
提示到这里大家可以自己再去尝试一下。
如果没有思路的话,这道题作者之前也是讲过的,还是很详细的,大家可以去看一看:

AcWing 278. 数字组合

(3)代码

代码这里就写一个空间优化过后的代码吧。

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=110000;
int a[N],f[N];
int n,m;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)scanf("%d",a+i);
    f[0]=1;
    for(int i=1;i<=n;i++)
        for(int j=m;j>=0;j--)
            if(j>=a[i])f[j]=f[j]+f[j-a[i]];
    cout<<f[m]<<endl;
    return 0;
}

5、AcWing 1023. 买书

(1)问题

在这里插入图片描述

(2)分析

这道题背后的模板比较明显,这道题考察的是完全背包问题,只不过这道题并不是让我们在众多方案 中选出一个最大值,而是得出所有符合条件的方案的总数。

(3)代码

这里写的是时间和空间均优化后的代码,如果大家不懂的话,建议去看在本篇文章开头所列出的几篇文章中的完全背包问题。

#include<iostream>
#include<algorithm>
using namespace std;
const int N=1100;
int a[N],f[N];
int main()
{
	a[1]=10,a[2]=20,a[3]=50,a[4]=100;
	int n;
	cin>>n;
	f[0]=1;
	for(int i=1;i<=4;i++)
	{
		for(int j=0;j<=n;j++)
		{
			if(a[i]<=j)
				f[j]+=f[j-a[i]];
		}
	}
	cout<<f[n]<<endl;
	return 0;
}

6、AcWing 1021. 货币系统

(1)问题

在这里插入图片描述

(2)分析

这道题很明显也是一道完全背包的简单应用问题,这里不做过多的解释了。

(3)代码

#include<iostream>
#include<algorithm>
using namespace std;
const int N=20,M=3100;
long long f[M],a[N];
int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",a+i);
	}
	f[0]=1;
	for(int i=1;i<=n;i++)
		for(int j=0;j<=m;j++)
		{
			f[j]=f[j];
			if(j>=a[i])
				f[j]+=f[j-a[i]];
		}
	cout<<f[m]<<endl;
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP8266 ArduinoIDE 物联网web客户端开发

一、使用 esp8266 实现 HTTP 客户端协议 在 arduinoIDE 中&#xff0c;并没有专门的 HTTP 协议客户端库。但是我们可以用 TCP 协议来自动手动实现。 1.1 HTTP 请求报文简介 所谓请求报文&#xff0c;即是基于 TCP/IP 协议发送的一串规范字符&#xff0c;这串规范字符描述了当…

liunx centos9安装nodejs并搭建vue 图文详解手把手教程

首先nodjs的官网找到liunx的安装包 https://nodejs.org/en/download/ 这里不推荐用源码安装&#xff0c;因为实在太慢&#xff0c;我安装时一下在不停安装连续15分钟都还在跑就是不知道什么原因 解压包 tar -xvf /root/node-v18.13.0-linux-x64.tar.xz设置全局 -s后面地址就是…

Android入门第59天-进入MVVM

什么是MVVM用“某大文豪亲”的话说&#xff1a;MVVM并不存在&#xff0c;只是xml里找控件找了太多了&#xff0c;自然而然就“找”出了一套共性。所以&#xff0c;MVVM只是包括了以下这些技术&#xff1a;DataBind&#xff1b;ViewModel双向绑定&#xff1b;Okhttp3retrofitrxj…

图解函数递归、数组详解

目录 一.修炼必备 二.图解递归的执行过程 三.数组 3.1 一维数组 3.2 二维数组 3.3 数组的共同问题 一.修炼必备 1.入门必备&#xff1a;VS2019社区版&#xff0c;下载地址&#xff1a;Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 (microsoft.com) 2.趁手武…

视频文缩略图SDK:GleamTech VideoUltimate Crack

Video Reader and Thumbnailer for .NET Core 和 .网络框架 读取地球上的任何视频文件格式。逐帧读取视频文件。生成有意义的缩略图。 VideoUltimate是最快&#xff0c;最简单的.NET视频阅读器和缩略图器&#xff0c;可以读取任何视频文件格式 在地球上。它允许您逐帧读取视频…

C++ 一文解决 数据库ODB 安装/调试/使用的问题

引用&#xff1a; ODB Download (codesynthesis.com) Installing ODB on Linux/UNIX (codesynthesis.com) 缘起&#xff1a; 在开发过程中发现&#xff0c;现有的软件缺乏持久层&#xff08;Persistence Layer&#xff09;&#xff0c;即专注于实现数据持久化应用领域的某个…

广义零样本学习的转移增量

摘要&#xff1a;零样本学习&#xff08;ZSL&#xff09;是一种成功的从未知类中对对象进行分类的范例。然而&#xff0c;它在广义零样本学习&#xff08;GZSL&#xff09;设置中遭受严重的性能降级&#xff0c;即以识别来自可见类和不可见类的测试图像。在本文中&#xff0c;为…

C语言-qsort函数基本使用

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【C/C】 先来看一下qsort函数的介绍&#xff1a; Compare 函数的返回值描述>0elem1将被排在elem2前面0elem1等于elem2<0elem1 将被…

LeetCode刷题模版:171-174、179

目录 简介171. Excel 表列序号172. 阶乘后的零173. 二叉搜索树迭代器174. 地下城游戏【未理解】179. 最大数结语简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,…

Redis学习【1】之Nosql概述

文章目录一 从技术发展探究使用Nosql的原因1.1 单机Mysql时代1.2 Memcached&#xff08;缓存&#xff09; MySQL 垂直拆分[读写分离]1.3 MySQL主从读写分离1.4 分表分库 水平拆分 Mysql 集群1.5 如今时代1.6 使用NoSQL的原因二 Nosql初识2.1 NoSQL的特点【解耦】三 NoSQL的四…

树状数组的原理和区间和

目录 一、前言 二、树状数组的原理 1、杂论 2、从二叉树到树状数组 3、神奇的 lowbit(x) 操作 4、tree[ ]数组&#xff1a;将一维信息转换为树形信息存储 5、基于 tree[ ] 的计算 6、tree[]的更新&#xff08;要加lowbit&#xff09; 三、树状数组的应用 1、单点修改…

流媒体方案之Nginx

1.Nginx可以作为流体服务器。2三种web服务器的比较3.推流端: FFmpeg使用RTMP协议向Nginx推流拉流端: •VLC播放器使用RTMP或HTTPFLV协议从Nginx拉流•浏览器使用HTTPFLV协议从Nginx拉流(安装flv.js)4.有两种方法&#xff1a;下载源码&#xff0c;手工编译使用Buildroot&#xf…

Redis分布式锁 | 黑马点评

目录 一、分布式锁概述 二、基于Redis的分布式锁 1、思路分析 2、初级版本 3、误删问题 4、改进分布式锁 5、原子性问题 6、使用Lua脚本解决原子性问题 7、setnx实现分布式锁存在问题 三、Redisson 1、Redisson快速入门 2、Redisson可重入锁原理 3、Redisson可重试…

从某一点出发沿任意一方向旋转矩阵计算思考与实现

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 上期讲到 绕任一向量旋转矩阵计算思考与实现 点击前往 点击前往 问题提出 之前讲到绕任一向量旋转矩阵实现&#xff0c;原来的向量都是从原点出发&#xff0c;现在把…

Ajax面试题目

更多Ajax面试题目可以查看专栏内容 1.AJAX应用和传统Web应用有什么不同&#xff1f; 传统的web前端与后端的交互中&#xff0c;浏览器直接访问Tomcat的Servlet来获取数据。Servlet通过转发把数据发送给浏览器。当我们使用AJAX之后&#xff0c;浏览器是先把请求发送到XMLHttpR…

Swift之struct二进制大小分析

随着Swift的日渐成熟和给开发过程带来的便利性及安全性&#xff0c;京喜App中的原生业务模块和基础模块使用Swift开发占比逐渐增高。本次讨论的是struct对比Class的一些优劣势&#xff0c;重点分析对包体积带来的影响及规避措施。 一、基础知识 1、类型对比 引用类型&#xff…

独立看门狗与窗口看门狗

定义 看门狗的本质是一个定时器&#xff0c;在启动后&#xff0c;需要在一定时间内再给它一个信号&#xff0c;俗称“喂狗”&#xff0c;如果没有按时“喂狗”&#xff0c;说明MCU可能处于非正常状态&#xff0c;这时看门狗就向MCU发送个复位信号&#xff0c;使整个系统重启&a…

51单片机数码管显示

文章目录前言一、数码管简介二、数码管原理图三、数码管显示原理四、静态数码管代表编写五、动态数码管总结前言 这篇文章将介绍数码管的显示其中包含了动态数码管和静态数码管两种。 一、数码管简介 数码管其实就是由多个发光二极管封装在一起组成“8”字型的器件当分别点亮…

【数据结构】超详细——堆的实现

一、堆的概念及性质 1.1 什么是堆&#xff1f; 堆是一种完全二叉树&#xff08;具体在下一章讲述&#xff09;&#xff0c;若二叉树的深度h&#xff0c;除了第h层外其余各层节点数满了&#xff0c;只有第h层缺额且该层结点靠左&#xff1b;任何一个数组可以看作完全二叉树&…

【14】C语言_函数简介

目录 1、C语言中函数的分类: 2、库函数 3、自定义函数 1、C语言中函数的分类: 1.库函数 2.自定义函数 2、库函数 为什么会有库函数? 1.我们知道在我们学习C语言编程的时候&#xff0c;总是在一个代码编写完成之后迫不及待的想知道结果&#xff0c;想把这个结果打印到我们的屏…