机器分配----线性dp难题(对于我来说)
题目:
总公司拥有高效设备M台, 准备分给下属的N个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。其中M <= 15,N <= 10。分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。
(非常简洁的题面,没有之一)
输入:
第1行有两个数,第一个数是分公司数N,第二个数是设备台数M。接下来是一个N*M的矩阵,表明了第i个公司分配j台机器的盈利。
输出:
第1行输出最大盈利值。接下来N行,每行2个数,即分公司编号和该分公司获得设备台数。
样例:
3 3 70
30 40 50 ===> 1 1
20 30 50 2 1
20 25 30 3 1
题面也很好理解:找出最大的分配方式,并输出路径。
思路:
1.求最大值,思路是线性dp,第 i 行 j 列的结果只与这一行选几个,和他上面的行选几个有关,所以可以用dp的思路来解。转移方程是
dp[ i ][ j ]=max(dp [ i ][ j ],dp[ i - 1 ][ k ]+a[ i ][ j - k ] );
2.保存路径
这一步是比较难的,对代码能力的要求较高,也是这道题的考点,先上一个比较暴力的,但肯定对的:
void Print(int i,int j){
if(i==0)return;
for(int k=0;k<=j;k++){
if(Max==dp[i-1][k]+a[i][j-k]){
Max=dp[i-1][k];
Print(i-1,k);
printf("%d %d\n",i,j-k);
break;
}
}
}
递归输出,在主函数里Print(n,m)。这样写相当于每一行都重新算了一遍。
(ps:这道题题目要求本来是输出N行,每行包括第 i 家公司和他所选的台数,但是这样递归输出,如果有的公司一台没选,这样的公司是不会输出的)
错误样例:2 2 666
1 666======》 1 2
1 1
(但是这道题的数据太菜了,这样写也能a。。。)
第二种方法:一般的用res数组保存每排每列所选的k,然后输出(我改这个改了11次也没过,哭辽!)
(不要抄这个!不要抄这个!不要抄这个!这个会WA!!!)
就讲一下思路吧。。。
if(dp[i][j]<=dp[i-1][k]+a[i][j-k]){
dp[i][j]=dp[i-1][k]+a[i][j-k];
M[i][j]=k;
}
if(Max<=dp[i][j]){
Max=dp[i][j];
F1=i;F2=j;
}
M[ i ][ j ]保存dp[ i ][ j ]的决策中选的那个k,F i,F j保存最大结果的 i, j 。
因为要从1~N输出,所以需要递归保存一下:
void Print(int i,int j){
if(M[i][j]==0){
ans[i]=j-M[i][j];
return;
}
Print(i-1,M[i][j]);
ans[i]=j-M[i][j];
}
ans[ i ]保存第 i 个公司所选机器数量。
然后输出结果即可。
这道题为什么这样写会WA呢?
附上错误样例:
2 15
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
大家自己思考一下,这样该怎么输出路径?
显然 1 1 1 0
2 1 2 15
的结果都是一样的,MAX=2。
标准答案和这个代码的结果各据其一。
就是一个多解没spj压正解的题。。。
总结:这道题主要难点有两个,一是转移方程,二是输出路径。
然后就没了。。。
机器分配----线性dp难题(对于我来说)的更多相关文章
- 机器分配——线性dp输出路径
题目描述 总公司拥有高效设备M台, 准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M <= 15 ...
- P2066 机器分配 (DP+DP输出)
题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M≤15,N≤10.分 ...
- luogu P2066 机器分配[背包dp+方案输出]
题目背景 无 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M≤15 ...
- 线性DP之机器分配
题目大意 自己瞅 (懒得打了) 思路 前面是很简单的线性dp,后面是模拟递归输出方案, 模拟递归可以设ny为机器数机器数,nx表示第nx个公司,tot为总盈利,那么则有\(a[nx][i]+dp[nx ...
- Luogu P2066 机器分配(dp)
P2066 机器分配 题面 题目背景 无 题目描述 总公司拥有高效设备 \(M\) 台,准备分给下属的 \(N\) 个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这 \(M\ ...
- 【线型DP】洛谷P2066 机器分配
[线型DP]洛谷P2066 机器分配 标签(空格分隔): 线型DP [题目] 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配 ...
- POJ2779 线性DP 或 杨氏三角 和 钩子公式
POJ2779 线性DP 或 杨氏三角 和 钩子公式 本来就想回顾一下基础的线性DP谁知道今早碰到的都是这种大难题,QQQQ,不会 这个也没有去理解线性DP的解法,了解了杨氏三角和钩子公式,做出了PO ...
- Qt容器类的对象模型及应用(线性结构篇:对于QList来说,sharable默认是false的,但对于接下来讲的QVector来说,sharable默认是true)
用Qt做过项目开发的人,肯定使用过诸如QList.QVector.QLinkList这样的模板容器类,它们虽然名字长的不同,但使用方法都大致相同, 因为其使用方法都大体相同,很多人可能随便拿一个容器类 ...
- JDOJ 1958 机器分配
JDOJ 1958: 机器分配 Description 某总公司拥有高效生产设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为总公司提供一定的盈利.问:如何分配这M台设备才能使国家得到 ...
随机推荐
- 鼠标移到图片上图片放大【css3实例】
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- python之csrf简介
django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功能有分为全 ...
- oracle之二实例管理及数据库的启动/关闭
实例管理及数据库的启动/关闭 2.1 实例和参数文件 1.instance 功能:用于管理和访问database.instance在启动阶段读取初始化参数文件(init parameter fil ...
- 【二叉树-最长路径系列(任意路径)】直径、最长同值路径、 最大路径和(DFS、树形DP)
总述 这类题目都是求一个最长路径,这个路径可以不经过根节点. 使用dfs(即递归地遍历树)的方法.维护一个全局最长路径max作为最终结果,而递归方法dfs返回的是含根节点的最长路径.(若不使用全局变量 ...
- 我的Python自学之路-002 字典的知识
'''字典是python中唯一的验证类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算.根据计算的结果决定value的存储地址.所以字典是无序存储的.且key必 ...
- hystrix(5) 延时检测
hystrix在执行命令的同事,会对执行延时进行检测,如果超过设置的延时时间,那么将停止执行,并返回fallback执行结果. if (properties.executionTimeoutEnabl ...
- 1.10HDFS 回收站机制
- 3.ConcurrentMap-并发Map
- zabbix关键字含义
Zabbix server :zabbix控制中心,收集数据,写入数据库都是他的工作 Zabbix Agent:部署在被监控服务器上的一个进程,负责和zabbix server 交互,执行命令. Ho ...
- python中生成随机整数(random模块)
1.从一个序列中随机选取一个元素返回: random.choice(sep) 2.用于将一个列表中的元素打乱 random.shuffle(sep) 3.在sep列表中随机选取k个 ...