AcWing 1013. 机器分配(分组背包问题与方案记录)

news2024/9/22 21:31:26

一、题目

在这里插入图片描述

二、思路

这道题其实不太容易看出背后的模型。这道题本质上是一个分组背包问题。我们将每一个公司看成一组,而在每一个组内,将不同情况下的盈利状况看作物品的价值,而得到这种利益所需的机器数目看作物品的体积。

因此,这个问题就变成了,从不同的组内,至多选取一个物品,在背包容量允许的条件下,我们所能携带的最大价值。

那么这道题的其中一问就可以解决了。如果大家不懂分组背包的话,建议大家去看作者之前的文章:分组背包问题详解

那么第二个问题是我们今天讨论的重点,即对于背包问题而言,我们如何存储最优解的方案?

此时我们采用拓扑图的角度来理解这个问题,我们求解答案的过程就是构建拓扑图的过程。我们将每个状态看作一个点,然后通过点与点之间的连接体现DP中的状态转移方程。如下图所示:
在这里插入图片描述A点就是我们初始化的状态,当我们的得到了A点后,才能够通过转移,即图中的边,得到状态B。

当我们算出了状态B和状态C的时候,才能够通过边的连接得到状态D,状态D到底是什么则需要对比由B和C转移过来的两条路线中哪个是当下的最优解,当比较出最优解后,我们的状态D就可以被赋值为这个最优解。

如果将上述的拓扑图看作一个动态的过程的话,我们会发现这是一个从一个点不断地变成图的过程

接下来,我们利用上面的图来分析如何得到详细地方案,首先我们想知道到达某个状态的方案,放在这个图里,即我们想知道到达一个点的路线(但并不是所有能到当前的点的路线都是答案,我们需要在这些路线中比较出最优的)。

很明显,我们需要先在图中定位到这个点,然后观察它的入度,如下图,假设我们想知道到达F点的最优解的路线:
在这里插入图片描述
单纯地看这个图的话,还是比较抽象的,因此我们把01背包的方程映射到这个图中,(这里只是因为01背包比较容易映射,分组背包等问题同理)。我们发现想要得到F状态可以通过DF和EF两个状态通过边分别转移过来。但是我们想得到的是最优的,如果两个转移状态的过程是相等的,即f[i-1][j-v]+w==f[i-1][j],那么就说明这两个边都可以(所以我们将这两个边搞成红色),任意选一个边即可。

接着,我们以DF这条边为例子,我们还需要知道D状态怎么转化而来,同理我们比较CD和BD两个转移过程,发现CD是最优的,那么DC就是最优解方案中的一部分。

就这样我们可以从终点逆推起点,从而记录方案。

那么这道题也同理,对于一个点而言,可以由前一个组内的任意一个物品转移过来,但是我们需要通过比较找到最优的路线。然后慢慢地逆推得到方案。

三、代码

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=15,M=20;
int f[N][M],v[N][M],w[N][M];
int way[N];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&w[i][j]);
            v[i][j]=j;
        }
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=m;j++)
        {
            for(int k=0;k<=m;k++)
            {
                if(j>=v[i][k])
                f[i][j]=max(f[i][j],f[i-1][j-v[i][k]]+w[i][k]);
            }
        }
    }
    cout<<f[n][m]<<endl;
    int j=m;
    for(int i=n;i>=1;i--)
    {
        for(int k=0;k<=m;k++)
        {
            if(j>=v[i][k]&&f[i][j]==f[i-1][j-v[i][k]]+w[i][k])
            {
                way[i]=k;
                j-=k;
                break;
            }
        }
    }
    for(int i=1;i<=n;i++)cout<<i<<" "<<way[i]<<endl;   
    return 0;
}

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

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

相关文章

SpringSession笔记

第一章、Session会话管理概述Session和Cookie回顾Session机制由于HTTP是无状态的协议&#xff0c;每次浏览器与服务器的交互过程就是一次对话&#xff0c;对话结束之后服务器不能记住你这个人。下次对话的时候服务端无法识别你是上次的人&#xff0c;所以需要一种机制来记录用户…

Win10 突然蓝屏安全模式进不了,没有别的电脑和装机U盘,怎么把资料临时导出来?

环境: Win 10专业版 DELL 3490 移动硬盘/普通U盘 问题描述: Win10 突然蓝屏安全模式进不了,没有别的电脑和装机U盘,怎么把资料临时导出来?目前可以进入Win RE 疑难-高级选项 解决方案: 1.先插入,移动硬盘或者普通U盘 2.多重启几次,自动修复系统失败画面,点击高…

Linux嵌入式开发——压缩与解压缩

文章目录Linux嵌入式开发——压缩与解压缩一、前期准备二、Linux下的压缩格式三、gzip压缩工具1、gzip压缩文件2、gzip压缩文件夹四、bzip2压缩工具五、tar打包工具tar参数对.tar.bz2进行压缩和解压缩压缩解压缩对.tar.gz进行压缩和解压缩压缩解压缩六、其他格式的压缩和解压缩…

Qt扫盲-网络编程概述

网络编程概述一、Qt网络编程概述二、Qt对Http&#xff0c;FTP应用层协议支持三、TCP通信编程支持四、UDP通信编程支持五、主机信息的获取六、网络代理七、底层管理的支持一、Qt网络编程概述 Qt Network模块提供了允许我们编写TCP/IP客户端和服务器的类。它提供了低级类来完成基…

【Java寒假打卡】JavaWeb-Session

【Java寒假打卡】JavaWeb-Session概述常用的方法HttpSession的获取HttpSession的使用概述 常用的方法 HttpSession的获取 HttpSession的使用 在第一个Servlet中获取请求的用户名获取HttpSession对象将用户名设置到共享数据中在第二个Servlet中获取HttpSession对象获取共享数据用…

java8新特性

接口中默认方法修饰为普通方法&#xff0c;实现接口时不需要重写方法Lambda表达式Stream流并行流原理校验当前对象是否为null当前对象为null,设置默认值 接口中默认方法修饰为普通方法Lambda表达式使用Lambda表达式 依赖于函数接口 在接口中只能够允许有一个抽象方法在函数接…

SpringCloud笔记

2023年最新笔记&#xff0c;全文约 3 万字&#xff0c;蕴含 Spring Cloud 常用组件 Nacos、OpenFeign、Seata、Sentinel 等 〇、简介 什么是Spring Cloud&#xff1f; ​ Spring Cloud是一系列框架的有序集合&#xff0c;是一种基于微服务的分布式架构技术。它利用 Spring Boot…

HBuilder的安装与试用

准备把前端框架Layui仔细学习一遍&#xff08;虽然Layui已经过了最流行的时候&#xff0c;但是很多项目都在用它&#xff09;&#xff0c;在B站找了一套《Layui框架精讲全套视频教程》&#xff0c;视频作者实操Layui时用的工具很方便&#xff0c;从弹幕中看到说用的是HBuilder&…

Springcloud 笔记

微服务架构微服务架构是一种架构模式&#xff0c;它体长将单一应用程序划分成一组小的服务&#xff0c;服务之间相互协调&#xff0c;互相配合&#xff0c;为用户提供最终价值。每个服务运行在其独立的进程中&#xff0c;服务与服务之间采用轻量级的通信机制**(如HTTP)互相协作…

电商直通车主图设计教程

商直通车主图设计教程&#xff01;无门槛在线设计&#xff0c;零基础轻松入门的电商设计工具&#xff0c;轻松就能搞定的主图设计工具&#xff0c;下面跟着小编的设计教程&#xff0c;一起学习如何使用在线工具乔拓云轻松设计专属的商品直通车主图&#xff0c;在线模板轻松设计…

Cadence PCB仿真使用Allegro PCB SI生成延迟仿真报告及报告导读图文教程

🏡《Cadence 开发合集目录》   🏡《Cadence PCB 仿真宝典目录》 目录 1,概述2,生成报告3,报告导读4,总结1,概述 本文简单介绍使用Allegro PCB SI生成网络的延迟性能评估的报告的方法,及延迟报告要点导读。 2,生成报告 第1步,选择需要生成报告的网络,然后单击右…

深度估计算法原理与论文解读

论文地址: Monocular Depth Estimation Using Laplacian Pyramid-Based Depth Residuals | IEEE Journals & Magazine | IEEE Xplore 深度估计算法原理 1.深度估计任务概述 深度估计,即通过输入的彩色图像,获得每个像素点离相机距离的远近(热度图) ,热度图的深浅表…

Linux内核显卡驱动(LVDS)初探

目录 0. 前言 1. menuconfig 2. 编译报错与打补丁 3. 设备树与display-timings 4. 拓展&#xff1a;RGB24 0. 前言 这次的工作主要是把某项目设备上(iMX6DL)的内核版本从 4.19.x 升级到 5.15.32&#xff0c;是作为该项目整个BSP升级计划的一部分。 该内核升级工作移交给…

Spring Cloud Alibaba商城实战项目基础篇(day03)

五、后台管理 5.1、商品服务 5.1.1、三级分类 5.1.1.1、查询所有菜单与子菜单 我们需要维护所有菜单以及各种子菜单&#xff0c;子菜单里面可能还有子菜单&#xff0c;所以我们采用递归的方式进行书写。 我们先在CategoryController中修改list方法&#xff0c;让他以组装树…

Day868.索引(上) -MySQL实战

索引&#xff08;上&#xff09; Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于索引&#xff08;上&#xff09;的内容。 某一个 SQL 查询比较慢&#xff0c;分析完原因之后&#xff0c;可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引&…

linux部署java项目cpu占用100%的排除故障

用top -c命令查看cpu占用高的进程 ![在这里插入图片描述](https://img-blog.csdnimg.cn/12af3f060fb84ce98b24c7247546b50b.png 发现cpu占用为99%的进程pid为24857 用top -Hp 24857查看cpu占用最高的线程 发现占用cpu97.3%的线程id为24926 将24926转为16进制 通过jstack查看进…

袋式除尘器—选型计算

1.处理气体量的计算计算袋式除尘器的处理气体时&#xff0c;首先要求出工况条件下的气体量&#xff0c;即实际通过袋式除尘器的气体量&#xff0c;并且还要考虑除尘器本身的漏风量。这些数据&#xff0c;应根据已有工厂的实际运行经验或检测资料来确定&#xff0c;如果缺乏必要…

Day09 - 子类父类多继承多层继承多态

1. 子类中访问父类中的私有属性和私有方法 如果想使用父类中的私有属性和私有方法,那么就需要在父类中,为这些私有的属性和方法,提供相应的公有的接口方法来间接访问2. 如何为父类中的属性进行初始化 在子类中如果定义了自己的初始化方法,那么这时父类的初始化方法就不会再执…

尚硅谷AJAX教程

优点&#xff1a;无需刷新页面获取数据&#xff0c;允许你根据用户事件来更新部分页面内容 缺点&#xff1a;没有浏览历史&#xff0c;不能回退&#xff0c;存在跨域&#xff0c;SEO不友好 原生XHR请求 get请求 <body><button>获取数据</button><scri…

弹性可微调,基于LCN光敏材料的触觉模拟系统

对于AR/VR体验来讲&#xff0c;体感、触觉模拟很重要&#xff0c;但现阶段还没有一种方便消费者使用、轻便的体感方案&#xff0c;因此Meta等公司不断在探索更好的体感技术。比如近期&#xff0c;Nature发表了一项来自荷兰埃因霍芬理工大学的新研究&#xff0c;该研究由Meta Re…