题目:

总公司拥有高效设备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难题(对于我来说)的更多相关文章

  1. 机器分配——线性dp输出路径

    题目描述 总公司拥有高效设备M台, 准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M <= 15 ...

  2. P2066 机器分配 (DP+DP输出)

    题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M≤15,N≤10.分 ...

  3. luogu P2066 机器分配[背包dp+方案输出]

    题目背景 无 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值.其中M≤15 ...

  4. 线性DP之机器分配

    题目大意 自己瞅 (懒得打了) 思路 前面是很简单的线性dp,后面是模拟递归输出方案, 模拟递归可以设ny为机器数机器数,nx表示第nx个公司,tot为总盈利,那么则有\(a[nx][i]+dp[nx ...

  5. Luogu P2066 机器分配(dp)

    P2066 机器分配 题面 题目背景 无 题目描述 总公司拥有高效设备 \(M\) 台,准备分给下属的 \(N\) 个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配这 \(M\ ...

  6. 【线型DP】洛谷P2066 机器分配

    [线型DP]洛谷P2066 机器分配 标签(空格分隔): 线型DP [题目] 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定的盈利.问:如何分配 ...

  7. POJ2779 线性DP 或 杨氏三角 和 钩子公式

    POJ2779 线性DP 或 杨氏三角 和 钩子公式 本来就想回顾一下基础的线性DP谁知道今早碰到的都是这种大难题,QQQQ,不会 这个也没有去理解线性DP的解法,了解了杨氏三角和钩子公式,做出了PO ...

  8. Qt容器类的对象模型及应用(线性结构篇:对于QList来说,sharable默认是false的,但对于接下来讲的QVector来说,sharable默认是true)

    用Qt做过项目开发的人,肯定使用过诸如QList.QVector.QLinkList这样的模板容器类,它们虽然名字长的不同,但使用方法都大致相同, 因为其使用方法都大体相同,很多人可能随便拿一个容器类 ...

  9. JDOJ 1958 机器分配

    JDOJ 1958: 机器分配 Description 某总公司拥有高效生产设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为总公司提供一定的盈利.问:如何分配这M台设备才能使国家得到 ...

随机推荐

  1. Redis 6.0.8 紧急发布,请尽快升级!

    大家周末愉快啊,今天分享一则重要通知. Redis 6.0.8 于 2020/9/10 日晚紧急发布!!! 可以看到这是一个紧急更新版本,使用了 Redis 6.0.7 Sentinel(哨兵)以及 ...

  2. 编程体系结构(03):Java集合容器

    本文源码:GitHub·点这里 || GitEE·点这里 一.集合容器简介 集合容器是Java开发中最基础API模块,通常用来存储运行时动态创建的元素,基本特点如下: 泛型特点,存储任意类型对象: 动 ...

  3. Windows下使用Nginx+Tomact做负载均衡

    前言 今天,王子与大家闲谈一下如何在Windows下使用Nginx+Tomcat做负载均衡的完整步骤,小伙伴们可以试着自己动手实践一下哦. 另外说明一点,本篇文章是纯实操文章,不涉及太多原理的解读,后 ...

  4. 用华为HMS ML kit人体骨骼识别技术,Android快速实现人体姿势动作抓拍&nbsp;

      你有没有过这种体验,拍照时对着镜头,脑子一片空白.表情僵硬.手和脚无处安放,最后拍出来的照片很是奇怪.拍照软件中的固定姿势抓拍功能可以帮助你:选择一个你想要的姿势模板,当你摆出同款姿势时,软件会进 ...

  5. php第一天-分支结构,循环结构,特殊的流程控制语句

    1.单向条件分支结构 <?php if(true) { echo "yes"; } ?> 2.双向条件分支结构 <?php $a = 10; if($a < ...

  6. Linux基本目录机构

    Linux基本目录机构 1. 基本介绍 Linux的文件系统采用级层式子的树状目录结构 最上层是根目录"/" Linux世界里,一切皆文件 2. 目录用途 /bin: 是Binar ...

  7. Spring学习(二)Spring IoC 和 DI 简介

    一.IOC(控制反转) 定义:反转控制 (Inversion Of Control)的缩写,即创建对象的反转控制. 正向控制:若要使用某个对象,需要自己去负责对象的创建. 反向控制:若要使用某个对象, ...

  8. 深入理解HDFS分布式文件系统

    深入理解HDFS:Hadoop分布式文件系统: https://blog.csdn.net/bingduanlbd/article/details/51914550

  9. 常用JVM 启动参数解析

    https://www.jianshu.com/p/a17dcef57559 https://www.cnblogs.com/zkyefei/p/9334562.html

  10. SQL注入之Mysql报错注入

    --志向和热爱是伟大行为的双翼. 昨天偷懒了没学什么东西,先自我反省一下 - -. 今天认真的学习了一下Mysql报错注入利用方法及原理,好久之前就像认真的学一下这个了,是在上海市大学生网络安全大赛中 ...