动态规划——机器分配、01背包问题
一、机器分配
题目名称:机器分配
题目描述:
总公司拥有高效设备M台,准备分给下属的N个分公司。
各分公司若获得这些设备,可以为国家提供一定的盈利。
问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。
其中M≤100,N≤100。
分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。输入输出格式
输入格式:
第一行有两个数,第一个数是分公司数N,第二个数是设备台数M;
接下来是一个N*M的矩阵,表明了第 I 个公司分配 J 台机器的盈利。输出格式:
第一行输出最大盈利值; 接下N行,每行有2个数,即分公司编号和该分公司获得设备台数。
(一)解题思路
1. 问题定义
总公司有n
个分公司,现在有m
台设备可以分配给这些分公司。每个分公司i
如果得到j
台设备,会产生一定的盈利a[i][j]
。任务是找到一个分配方案,使得所有分公司获得的盈利总和最大。
2. 动态规划的基本思想
动态规划是一种通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。它通常用于优化问题,比如求最大值或最小值。在这个问题中,我们使用动态规划来找到最大的盈利总和。
3. 状态定义
我们定义一个二维数组f
,其中f[i][j]
表示前i
个分公司分配j
台设备时的最大盈利。注意,这里我们是从1开始索引的,所以f[1][0]
表示第一个分公司没有分配到设备时的盈利(通常是0,因为没有设备就没有盈利)。
4. 状态转移方程
对于每个分公司i
和每个可能的设备数量j
,我们需要考虑把k
台设备(其中0 <= k <= j
)分配给分公司i
,然后看看这样分配是否会比之前的分配方案产生更多的盈利。我们可以使用以下状态转移方程来更新f[i][j]
:
f[i][j] = max(f[i][j], f[i-1][j-k] + a[i][k]) |
这里,f[i-1][j-k]
表示前i-1
个分公司分配j-k
台设备时的最大盈利,a[i][k]
表示第i
个分公司分配k
台设备时的盈利。我们通过遍历所有可能的k
值来找到使f[i][j]
最大的那个。
5. 记录路径
为了能够在找到最大盈利后回溯出具体的设备分配方案,我们需要一个额外的二维数组res
来记录每个状态f[i][j]
是如何达到的。具体来说,res[i][j]
应该存储分配给分公司i
的设备数量k
,这个k
是在计算f[i][j]
时使盈利最大的那个。
6. 初始化
我们需要初始化f
数组和res
数组。通常,我们会把f
数组的所有元素初始化为一个很小的值(表示还没有计算过),然后把f[0][0]
初始化为0(表示没有分公司和没有设备时的盈利为0)。在这个问题中,由于盈利是非负的,并且我们总是试图最大化盈利,所以我们可以简单地把f
数组的所有元素(除了f[0][0]
)看作是未初始化的,然后在计算过程中更新它们。res
数组也需要初始化,但在这个问题中,我们只需要在更新f[i][j]
的同时也更新res[i][j]
即可。
7. 回溯
一旦我们计算出了f[n][m]
(即所有分公司分配所有设备时的最大盈利),我们就可以使用res
数组来回溯出具体的设备分配方案。我们从f[n][m]
开始,根据res[n][m]
找到分配给最后一个分公司的设备数量,然后递归地找到分配给前面分公司的设备数量,直到我们回溯到f[1][0]
(或实际上是我们开始回溯的第一个有效状态)。
(二)代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <cstdlib>
#include <queue>
#include <vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 30
#define MOD 2520
#define E 1e-12
using namespace std;int a[N][N], f[N][N], res[N][N]; void print(int x, int y) {if (x == 0)return;print(x - 1, y - res[x][y]);printf("%d %d\n", x, res[x][y]);
}int main() {int n, m;cin >> n >> m; for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) cin >> a[i][j];for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) for (int k = 0; k <= j; k++) if (f[i][j] <= f[i-1][j-k] + a[i][k]) {f[i][j] = f[i-1][j-k] + a[i][k];res[i][j] = k; }// 输出结果cout << f[n][m] << endl;print(n,m);return 0;
}
二、01背包问题
描述
一个旅行者有一个最多能装 M 公斤的背包,现在有 n 件物品,它们的重量分别是W1,W2,…,Wn,它们的价值分别为C1,C2,…,Cn,求旅行者能获得最大总价值。
输入格式
第一行:两个整数,M(背包容量,M≤200)和N(物品数量,N≤30);
第2至N+1行:每行二个整数Wi,Ci,表示每个物品的重量和价值。输出格式
仅一行,一个数,表示最大总价值。
样例
输入样例
10 4
2 1
3 3
4 5
7 9输出样例
12
(一)解题思路
- 问题定义与数据输入
(1)我们需要明确背包的容量m
和物品的数量n
。
(2)输入每个物品的体积v[i]
和价值w[i]
(其中i
代表物品编号)。 - 动态规划数组的初始化
(1)定义一个二维数组f[i][j]
,其中i
代表物品编号(从1到n),j
代表当前的背包容量(从0到m)。
(2)f[i][j]
表示当只考虑前i
个物品,且背包容量为j
时,能够获得的最大价值。
(3)初始化f[0][j]
为0,表示当没有物品可选时,任何背包容量下的最大价值都是0。 - 状态转移方程
(1)对于每个物品i
和每个可能的背包容量j
,我们需要决定是否将该物品放入背包中。
(2)如果不放入物品i
,则f[i][j] = f[i-1][j]
,即当前最大价值等于前i-1
个物品在背包容量为j
时的最大价值。
(3)如果放入物品i
,则f[i][j] = f[i-1][j-v[i]] + w[i]
,但前提是背包容量j
必须大于等于物品i
的体积v[i]
。
(4)因此,状态转移方程为:f[i][j] = max(f[i-1][j], f[i-1][j-v[i]] + w[i])
当j >= v[i]
时f[i][j] = f[i-1][j] 当j<v[i]时
(二)代码
#include <iostream>
using namespace std;const int N = 210;
int n, m; // n表示物体个数,m表示背包容量
int v[N], w[N]; // v[i]表示第i个物品的体积,w[i]表示第i个物品的价值
int f[N][N]; // f[i][j]表示前i个物品在总体积不超过j时的最大价值int main() {cin >> m >> n; // m表示背包容量,n表示物体个数for (int i = 1; i <= n; i++) {cin >> v[i] >> w[i]; // 读入每个物品的体积和价值}// 初始化f数组,f[0][j]表示没有物品可选时,任何体积下的最大价值都是0for (int j = 0; j <= m; j++) {f[0][j] = 0;}// 动态规划求解背包问题for (int i = 1; i <= n; i++) { // 表示只选择前i个物体for (int j = 1; j <= m; j++) { // 表示体积f[i][j] = f[i - 1][j]; // 如果不选第i个物品,则价值等于前i-1个物品在体积j下的最大价值if (j >= v[i]) { // 如果体积允许选择第i个物品f[i][j] = max(f[i][j], f[i - 1][j - v[i]] + w[i]); // 选择第i个物品,并更新最大价值}}}// 输出结果,表示选择前n个物品,体积为m时的最大价值cout << f[n][m] << endl;return 0;
}
相关文章:
动态规划——机器分配、01背包问题
一、机器分配 题目名称:机器分配 题目描述: 总公司拥有高效设备M台,准备分给下属的N个分公司。 各分公司若获得这些设备,可以为国家提供一定的盈利。 问:如何分配这M台设备才能使国家得到的盈利最大?求出最…...
leetcode——哈希表1
242.有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词 。 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输入: s "rat", t "car" 输出: false 提示: 1 < s.le…...
STM32+模拟或硬件IIC+SHT20驱动问题:接上拉电阻、BUSY死锁?
主要问题: 1,使用STM32F103C8T6,模拟IIC,SCL和SDA口配置为推挽输出上拉,主要是SDA脚,每次都要输出输入模式重新配置,虽然也能通信,但不稳定,出错率大; 2&…...
Android四大组件——Activity(二)
一、Activity之间传递消息 在(一)中,我们把数据作为独立的键值对进行传递,那么现在把多条数据打包成一个对象进行传递: 1.假设有一个User类的对象,我们先使用putExtra进行传递 activity_demo06.xml <…...
PHP实现华为OBS存储
一:华为OBS存储文档地址 官方文档:https://support.huaweicloud.com/obs/index.html github地址:https://github.com/huaweicloud/huaweicloud-sdk-php-obs 二:安装华为OBS拓展 composer require obs/esdk-obs-php 三&#x…...
SQL连续登录问题(详细案例分析)
如果要统计用户活跃度,那就涉及连续登录问题,接下来将举一个简单的例子来详细说明这个问题: 一、创建一些模拟数据 一些测试数据如下: deviceid1,2022-10-26,2022-10-26,2022-11-01 deviceid1,2022-10-26,2022-11-03,2022-11-0…...
OpenCV相机标定与3D重建(9)相机标定函数calibrateCameraRO()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::calibrateCameraRO 是 OpenCV 中用于相机标定的函数,它允许固定某些点来进行更精确的标定。 函数原型 double cv::calibrateCa…...
【一本通】农场派对
【一本通】农场派对 💐The Begin💐点点关注,收藏不迷路💐 N头牛要去参加一场在编号为x(1≤x≤n)的牛的农场举行的派对(1≤N≤1000),有M(1≤m≤100000)条有向道路,每条路长ti(1≤ti≤100);每头牛…...
uniapp中父组件传参到子组件页面渲染不生效问题处理实战记录
上篇文件介绍了,父组件数据更新正常但是页面渲染不生效的问题,详情可以看下:uniapp中父组件数组更新后与页面渲染数组不一致实战记录 本文在此基础上由于新增需求衍生出新的问题.本文只记录一下解决思路. 下面说下新增需求方便理解场景: 商品信息设置中添加抽奖概率设置…...
基础暴力算法
线性枚举 线性枚举(Linear Enumeration)是一种暴力枚举的方法,它逐一检查每个可能的解,适用于搜索和枚举问题。 其核心思路是:对问题的所有可能情况逐一进行遍历,并针对每种情况判断是否满足条件…...
【复变函数】三、复变函数的积分
目录 1. 复变函数积分1.1. 复积分1.2. 存在性与计算1.2.1 第二类曲线积分与格林公式1.2.2 第一类曲线积分与参数式 1.3. 性质1.4. 圆径积分 2. 柯西积分定理2.1. 柯西(Cauchy)基本定理与莫雷拉(Morrera)定理2.2. 复合闭路定理2.3.…...
ChatGPT Pro是什么
ChatGPT Pro 和 ChatGPT Plus 的区别主要体现在功能范围、适用场景和目标用户上。 ChatGPT Plus 功能 • 价格:20美元/月。 • 目标用户:针对个人用户设计。 • 主要特点: • 在高峰期响应速度更快。 • 使用高级模型(如 GPT-4…...
React - echarts 世界地图,中国地图绘制
中国地图 首先需要一个包含中国所有省份名称的 json,这个好多网站都能找到。 我传到资源里了,放百度网盘怕太长时间不登录给我删掉了。 中国地图中文版json 我把地图抽出来单独做成了组件,这样用的时候比较方便. 使用的时候: …...
knife4j-openapi3 4.5 最基本的使用 openAPI
最基本的使用,配置太多懒得研究 SpringBoot 整合 knfe4j ,使用 OpenAPI3 规范,这个兄弟写的挺好 环境: spring-boot-starter-parent:3.4.0 1. 依赖 <dependency><groupId>com.github.xiaoymin</gr…...
如何在 Ubuntu 22.04 上安装和使用 Apache Kafka
简介 Apache Kafka是一个高性能、低延迟的分布式流处理平台,广泛用于构建实时数据管道和流式应用。本文将指导你如何在Ubuntu 22.04系统上快速部署Apache Kafka,让你体验到Kafka在处理大规模实时数据流方面的强大能力。通过本教程,你将学会如…...
Linux:network:添加ip的时候自动添加一个本地路由
文章目录 问题问题 最近在看一个路由的问题,顺便看内核代码,发现在添加IP的时候,内核会自动添加一个local route。 net/ipv4/devinet.c inet_rtm_newaddr->__inet_insert_ifa /* Send message first, then call notifier.Notifier will trigger FIB update, so thatlis…...
Android 10、11、12存储适配相关
AndroidQ(10)分区存储完美适配 - 简书前言 最近时间在做AndroidQ的适配,截止到今天AndroidQ分区存储适配完成,期间出现很多坑,目前网上的帖子大部分都是概述变更内容,接下来的几篇帖子都是对分区存储实际...https://www.jianshu.c…...
如何将视频转化为音频?五个方法策略
在日常生活中,我们经常需要将视频中的音频提取出来,以便在特定的场合使用。无论是为了制作铃声、背景音乐,还是为了进行语音转文字处理,视频转音频的需求都非常普遍。如何将视频转化为音频?本文将详细介绍多种将视频转…...
ecovadis评估最新标准
EcoVadis评估的最新标准主要包括奖牌评估规则和新增的徽章规则,以下是对这两方面的详细阐述: 一、奖牌评估规则 评估范围:EcoVadis的评估总分为100分,评估内容涵盖环境、劳工与人权、商业道德、可持续采购等四大主题。 奖牌等级…...
Java版-图论-最小生成树-Kruskal算法
实现描述 为了造出一棵最小生成树,我们从最小边权的边开始,按边权从小到大依次加入,如果某次加边产生了环,就扔掉这条边,直到加入了 n-1 条边,即形成了一棵树。 实现代码 首选我们对所有的边,…...
【单片机开发】MCU三种启动方式(Boot选择)[主Flash/系统存储器(BootLoader)/嵌入式SRAM]
目录 参考资料: 利用 Boot 选择不同的启动方式: 单片机的存储结构(主 FLASH/系统存储器/嵌入式 SRAM): 1. Cortex-M 内核芯片——启动原理: 1.1. 启动流程: 1.2. 根据单片机的存储器映射和架构图:启动…...
实验15 验证LSTM模型的长程依赖
本次实验依托上个实验 一 模型构建 创建LSTM模型,里面包括初始化init函数、初始化权重函数_init_weights、初始化状态函数init_state、前向传播函数forward。 init函数:虽然每个时间的输入和隐层都是一样的,但是他们会有四组不同的权重&am…...
Charles功能说明
1.扫把(clear the current Session) (前头方向) 作用:清除所有抓取的包(正方形框) 2.中心圈-未启用显示(Star Recording)点击启动 -启动之后显示(Stop Recording)点击停止 作用:启动之后开始抓取包(刷新一次页面或跳转抓取内容) 3.锁-未启动显示(Star SSL Proxying)点击启动 -启…...
自动秒收录程序与自动秒收录网站源码论坛版本下载
自动秒收录程序与自动秒收录网站源码论坛版本下载 随着互联网的快速发展,网站优化已成为众多企业和个人博主提升在线影响力的关键手段。其中,SEO(搜索引擎优化)作为提升网站排名的核心策略,备受关注。而SEO优化的一个…...
HTML颜色-HTML脚本
HTML脚本 js使得HTML页面具有更强的动态和交互性 HTML<script>标签 标签用于定义客户端脚本,比如javascript 可包含脚本语句,也可以通过src属性指向外部的脚本文件 JavaScript最常用于图片操作,表单验证以及动态的内容更新 HTML<n…...
【WRF理论第十三期】详细介绍 Registry 的作用、结构和内容
目录 1. Introduction:介绍 Registry 的作用和功能。2. Registry Contents:详细描述 Registry 的结构和内容,包括各个部分的条目类型。2.1. DIMSPEC ENTRIES(维度规格条目)2.2. STATE ENTRIES(状态变量条目…...
使用Kimi开发自己的问答应用
概述 Kimi是大家常用的一个人工智能助手,本文使用Kimi开发文档,以node作为后端,开发与一个问答系统 实现效果 Kimi简介 Kimi是由Moonshot AI开发的人工智能助手,擅长中文和英文对话。目标是帮助用户解决问题、提供信息和执行任…...
Vue前端开发-路由其他配置
在路由文件中,除了跳转配置外,还可以进行路径重定向配置,如果没有找到对应的地址,还可以实现404的配置,同时,如果某个页面需要权限登录,还可以进行路由守卫配置,接下来,分…...
AI与遥感的融合:构建新一代智能监测作业平台
在测绘地理信息与遥感领域,人工智能(AI)技术的融合正推动着一场监测作业模式的革命。AI不仅提升了数据处理的效率,还极大地扩展了遥感技术的应用范围和深度。 遥感监测的智能化趋势 随着遥感数据量的激增,传统的人工…...
3D 视觉定位技术:汽车零部件制造的智能变革引擎
在汽车零部件制造领域,传统工艺正面临着前所未有的挑战。市场对于零部件精度与生产效率近乎苛刻的要求,促使企业寻求突破之道。而 3D 视觉定位技术,为汽车零部件制造开启了精准定位与智能化生产的新纪元。 3D 视觉定位系统的核心技术原理 3…...
git提交时出现merge branch main of xxx
git提交时出现merge branch main of xxx 原因: 1、同事commit了一个修改A,push到remote 2、我把这个修改直接pull了下来(pull是fetchmerge的操作,自动合并到本地workspace) 3、同事因为后续的commit有冲突,…...
重生之我在异世界学编程之C语言:深入结构体篇(上)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文《1》 结构体的两种声明一、结构…...
到达率和服务率在python中实现
到达率和服务率在python中实现 概念理解 到达率(Arrival Rate):是指顾客(或任务、事件等)到达服务系统的平均速率,通常用单位时间内到达的数量来表示。例如,在一个客服中心,每小时平均有10个客户来电咨询,这里的每小时10个客户就是到达率。服务率(Service Rate):是…...
重视猫艾滋:宠物健康的隐秘挑战
猫艾滋,全称为猫获得性免疫缺陷综合征(Feline Acquired Immunodeficiency Syndrome),是由猫免疫缺陷病毒(FIV)感染引起的一种严重危害猫类健康的疾病。虽然其名称与人类艾滋病相似,但猫艾滋仅在…...
使用长轮询解决某些场景的实时消息推送需求
需求来源 最近做一个需求实现在移动端通过按钮,远程控制大屏幕上展示的资源进行实时切换,可以展示一个大屏页面,可以展示一段视频,也可以展示一张图片。 解决思路 大屏幕上打开一个游览器,访问指定动态资源展示页面…...
uniapp-内部项目使用文档
uniapp-内部项目使用文档 目录 uniapp-内部项目使用文档阶段1自行实现内容:阶段1问题记录: 阶段2自行实现内容: 阶段3 APP项目介绍及规范阶段4 公共组件方法UseList 列表页面HooksListItem 列表项uni-load-more 列表加载更多组件CardTitle 列…...
linux搭建NFS服务和autofs自动挂载NFS
文章目录 1、nfs服务1、nfs原理2、RPC和NFS通讯原理3、RPC和NFS流程4、NFS工作流程5、服务端搭建6、客户端搭建7、autofs自动挂载 1、nfs服务 1、nfs原理 是一个NAS的存储,通过网络来进行文件的共享,表现出来的形式就是一个文件夹 可以支持多个linux挂…...
springboot415社区网格化管理平台的构建-(论文+源码)_kaic
摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本社区网格化管理平台就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据…...
ubuntu下open-webui + ollama本地大模型部署
文章目录 nvidia gpu驱动安装 安装卸载 ollama 部署 添加docker秘钥docker配置添加国内镜像源ollama安装 从源拉取ollama镜像。启动一个ollama容器 通过ollama下载模型到本地检验本地模型 open-webui 部署 安装容器和镜像下载webui使用查看模型运行时内存、cpu、gpu占用 业余…...
自动化运维-配置Mysql、emqx、redis、nginx等通用性Linux日志分割工具 - logrotate
前言:logrotate 是一个在 Linux 系统中用于管理和轮转日志文件的工具。它的主要目的是帮助系统管理员自动执行日志文件的轮转、压缩、删除和邮件通知等任务,以防止日志文件占用过多的磁盘空间,同时保持日志文件的可管理性。 参考命令&#x…...
71、docker镜像制作上传/下载到阿里云
基本思想:简单学习一下如何制作镜像和上传下载到私有阿里云,然后构建一个gpu的训练/推理环境,以备后续使用 一、配置环境 ubuntu@ubuntu:~$ sudo apt-get install docker.ioubuntu@ubuntu:~$ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS P…...
力扣--LCR 178.训练计划VI
题目 教学过程中,教练示范一次,学员跟做三次。该过程被混乱剪辑后,记录于数组 actions,其中 actions[i] 表示做出该动作的人员编号。请返回教练的编号。 示例 1: 输入:actions [5, 7, 5, 5] 输出&#…...
独孤思维:又有一个副业项目降价了
不要过早量出底牌,不然会变得低贱且廉价。 昨天在一个群里,看到有个博主,没有成交订单。 她把和用户的聊天对话发出来,我们大致看了下。 发现人家是有意向付费的。 但是这个博主过于心急,说今天加入可以优惠&#…...
【笔记】分布式任务调度平台XXL-JOB
这篇笔记主要记录以下内容: (1)第一次启动xxl-job的过程 (2)模块、文件、数据库(表和字段)的作用 (3)极少的源码解读(XxlJobConfig) 有点像实…...
Java基础总结上(Ref:JavaGuide)
基础概念与常识 Java语言有哪些特点,优点? 简单易学,是一门面向对象的语言,有封装继承多态三大特性,而且有多重防护机制保证安全性,例如权限修饰符,限制程序直接访问操作系统资源。通过JIT编译…...
嘉誉府5区共有产权看房记
特地工作日来看下嘉誉府5区的网红共有产权的房子,主要是冲着均价2.1万/平才来看。说实话从塘尾地铁步行到嘉誉府5区还挺需要时间的哈。可能以后需要电驴代步到地铁?确实楼盘现在是现楼,今年买明年住。鸿荣源确实很666哈。 今天来不需要排队&a…...
PostgreSQL函数中使用now()或current_timestamp的异同
在PostgreSQL函数中使用now()或current_timestamp可以获取当前的日期和时间。 now()函数返回当前的日期和时间,包括时区信息。它可以用于记录操作的时间戳或在查询中进行时间比较。 current_timestamp函数也返回当前的日期和时间,但不包括时区信息。它…...
跟李笑来学美式俚语(Most Common American Idioms): Part 56
Most Common American Idioms: Part 56 前言 本文是学习李笑来的Most Common American Idioms这本书的学习笔记,自用。 Github仓库链接:https://github.com/xiaolai/most-common-american-idioms 使用方法: 直接下载下来(或者clone到本地…...
类和对象一
目录 1.类的引入 2.类的定义 3.访问限定符 4.类的作用域 5.类对象模型 6.类的大小 1.类的引入 C语言结构体中只能定义变量,在C中,结构体不仅可以定义变量,也可以定义函数。 C兼容C语言,结构用法可以继续使用 同时sruct也升…...
两个数的和最小
两个数的和最小 C 代码C 代码Java 代码Python 代码 💐The Begin💐点点关注,收藏不迷路💐 给你n个整数,你可以从中任意取两个数a和b,问a加上b的和的绝对值最小可能是多少? 输入 有多组测试数据…...