热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

一、题目二、思路这道题其实不太容易看出背后的模型。这道题本质上是一个分组背包问题。我们将每一个公司看成一组,而在每一个组内,将不同情况下的盈利状况看作


一、题目

在这里插入图片描述


二、思路

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

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

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

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

此时我们采用拓扑图的角度来理解这个问题,我们求解答案的过程就是构建拓扑图的过程。我们将每个状态看作一个点,然后通过点与点之间的连接体现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
#include
#include
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&#61;1;i<&#61;n;i&#43;&#43;)
for(int j&#61;1;j<&#61;m;j&#43;&#43;)
{
scanf("%d",&w[i][j]);
v[i][j]&#61;j;
}
for(int i&#61;1;i<&#61;n;i&#43;&#43;)
{
for(int j&#61;0;j<&#61;m;j&#43;&#43;)
{
for(int k&#61;0;k<&#61;m;k&#43;&#43;)
{
if(j>&#61;v[i][k])
f[i][j]&#61;max(f[i][j],f[i-1][j-v[i][k]]&#43;w[i][k]);
}
}
}
cout<<f[n][m]<<endl;
int j&#61;m;
for(int i&#61;n;i>&#61;1;i--)
{
for(int k&#61;0;k<&#61;m;k&#43;&#43;)
{
if(j>&#61;v[i][k]&&f[i][j]&#61;&#61;f[i-1][j-v[i][k]]&#43;w[i][k])
{
way[i]&#61;k;
j-&#61;k;
break;
}
}
}
for(int i&#61;1;i<&#61;n;i&#43;&#43;)cout<<i<<" "<<way[i]<<endl;
return 0;
}






推荐阅读
  • 寒假作业解析:第三周 2月12日 第7题
    尽快完成之前的练习任务!每日一练2.1 Problem A Laurenty and Shop 的题目要求是选择两条不同的路线以最小化总的等待时间。简要分析:通过对比不同路线的等待时间,可以找到最优解。此问题可以通过动态规划或贪心算法来解决,具体取决于路线的复杂性和约束条件。 ... [详细]
  • 在洛谷 P1344 的坏牛奶追踪问题中,第一问要求计算最小割,而第二问则需要找到割边数量最少的最小割。通过为每条边附加一个单位权值,可以在求解最小割时优先选择边数较少的方案,从而同时解决两个问题。这种策略不仅简化了问题的求解过程,还确保了结果的最优性。 ... [详细]
  • 单链表的高效遍历及性能优化策略
    本文探讨了单链表的高效遍历方法及其性能优化策略。在单链表的数据结构中,插入操作的时间复杂度为O(n),而遍历操作的时间复杂度为O(n^2)。通过在 `LinkList.h` 和 `main.cpp` 文件中对单链表进行封装,我们实现了创建和销毁功能的优化,提高了单链表的使用效率。此外,文章还介绍了几种常见的优化技术,如缓存节点指针和批量处理,以进一步提升遍历性能。 ... [详细]
  • 本文介绍了如何在iOS平台上使用GLSL着色器将YV12格式的视频帧数据转换为RGB格式,并展示了转换后的图像效果。通过详细的技术实现步骤和代码示例,读者可以轻松掌握这一过程,适用于需要进行视频处理的应用开发。 ... [详细]
  • 题目链接: Caninepoetry问题概述:给定一个仅包含小写字母的字符串,允许将任意位置的字符修改为任意其他小写字母。目标是通过最少次数的修改,使字符串中所有长度大于1的子串均满足特定条件。本文详细分析了该问题,并运用思维与贪心算法,提出了一种高效解决方案。通过对字符串的深入解析,我们探讨了如何在最小化修改次数的同时,确保所有子串符合要求。 ... [详细]
  • 在探讨P1923问题时,我们发现手写的快速排序在最后两个测试用例中出现了超时现象,这在意料之中,因为该题目实际上要求的是时间复杂度为O(n)的算法。进一步研究题解后,发现有选手使用STL中的`nth_element`函数成功通过了所有测试点。本文将详细分析这一现象,并提出相应的优化策略。 ... [详细]
  • 本文探讨了在硬币找零问题中使用枚举法的具体应用。具体而言,题目要求将一定数额的零钱换成5分、2分和1分的硬币,并且每种硬币至少需要使用一枚。研究旨在找出所有可能的换法组合。输入数据为一行,包含一个在8到100之间的整数,表示待换的零钱数额。通过详细的枚举分析,本文提供了高效的解决方案,并验证了其在实际应用中的可行性和有效性。 ... [详细]
  • 图论入门基础教程
    图论是计算机科学和数学中的重要分支,本教程旨在为初学者提供全面的基础知识。通过实例解析,如“昂贵的聘礼”问题,讲述了一个年轻探险家在印第安部落与酋长女儿的爱情故事,展示了图论在解决实际问题中的应用。教程内容涵盖了图的基本概念、表示方法以及常见算法,适合各类读者学习。 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 在Kohana 3框架中,实现最优的即时消息显示方法是许多开发者关注的问题。本文将探讨如何高效、优雅地展示flash消息,包括最佳实践和技术细节,以提升用户体验和代码可维护性。 ... [详细]
  • 本文探讨了 Java 中 Pair 类的历史与现状。虽然 Java 标准库中没有内置的 Pair 类,但社区和第三方库提供了多种实现方式,如 Apache Commons 的 Pair 类和 JavaFX 的 javafx.util.Pair 类。这些实现为需要处理成对数据的开发者提供了便利。此外,文章还讨论了为何标准库未包含 Pair 类的原因,以及在现代 Java 开发中使用 Pair 类的最佳实践。 ... [详细]
  • 深入解析C语言中的动态规划算法:以背包问题为例
    本文深入探讨了C语言中动态规划算法的应用,以经典的背包问题为例进行详细解析。通过实例分析,展示了如何利用动态规划解决复杂优化问题,并提供了高效的代码实现方法。文章不仅涵盖了算法的基本原理,还讨论了其在实际编程中的应用技巧和优化策略,为读者提供了全面的理解和实践指导。 ... [详细]
  • 2012年9月12日优酷土豆校园招聘笔试题目解析与备考指南
    2012年9月12日,优酷土豆校园招聘笔试题目解析与备考指南。在选择题部分,有一道题目涉及中国人的血型分布情况,具体为A型30%、B型20%、O型40%、AB型10%。若需确保在随机选取的样本中,至少有一人为B型血的概率不低于90%,则需要选取的最少人数是多少?该问题不仅考察了概率统计的基本知识,还要求考生具备一定的逻辑推理能力。 ... [详细]
  • 本文深入探讨了URAL 1297问题,重点分析了使用后缀数组求解最长回文子串的方法。通过详细解析算法的实现步骤和优化策略,本文提供了高效的解决方案,并结合实际案例进行了验证。此外,文章还讨论了后缀数组在字符串处理中的广泛应用及其性能优势。 ... [详细]
  • 深入理解 Java 控制结构的全面指南 ... [详细]
author-avatar
张骞在这里
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有