小日记:

1、今天新学的字体颜色,尽管不熟悉,但玩的666,卡星(开心)

╰( ̄▽ ̄)╮╰( ̄▽ ̄)╮╰( ̄▽ ̄)╮╰( ̄▽ ̄)╮╰( ̄▽ ̄)╮╰( ̄▽ ̄)╮

2、今天油腔滑调,谅解亿下

P2066 机器分配

题目

总公司拥有高效设备\(M\)台,准备分给下属的\(N\)个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这\(M\)台设备才能使国家得到的盈利最大?

求出最大盈利值。其中\(M≤15,N≤10\)。

分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。

输入

第一行有两个数,第一个数是分公司数\(N\),第二个数是设备台数M。

接下来是一个\(N*M\)的矩阵,表明了第 \(I\)个公司分配 \(J\)台机器的盈利。

输出

第1行为最大盈利值

第2到第n为第i分公司分x台

\(P.S.\) 要求答案的字典序最小(为后文埋下伏笔)

样例

解析

设\(f[i][j]\)为前\(i\)个公司总共分配\(j\)台机器的最大利润。对于第\(i\)家子公司,我们可以给其分配的机器台数为:\(1-m\)

所以在该区间内枚举一个值k,状态转移方程即为:

\(f[i][j]=max(f[i-1][j-k],f[i][j])\)

那么,如何处理方案输出问题呢?

我们设\(path[i][j][h]\)对于前i个公司共分配\(j\)台机器的最优方案,第\(h\)个公司应分配多少台机器,当状态发生转移时,更新\(path\)数组即可。最终的答案就存放在\(path[n][m][i]\)之中。

代码如下

#include <bits/stdc++.h>
using namespace std;
int a[25][25];
int f[25][25];
int path[25][25][25];
int n,m;
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
scanf("%d",&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];
for (int l=1;l<i;l++)
path[i][j][l]=path[i-1][j-k][l];
path[i][j][i]=k;
}
}
printf("%d\n",f[n][m]);
for (int i=1;i<=n;i++)printf("%d %d\n",i,path[n][m][i]);
return 0;
}

巴特(But),you only have 90 分的好成绩

Why???

回到题面,我们会发现小小的一行字,人畜无害的鸭子(样子)

     >(' )
)/
/( <---鸭子
/ `----/
\ ~=- /——:

要求答案的字典序最小

顿时,我***********

辣么,如何使字典序最小呢?这需要我们倒着枚举。

设方程式表示的意思为“不给”第i家公司k台机器(k的值域同上)

注意:并不是\(f\)的意思

那么状态转移方程需改为:

f[i][j]=max(f[i][k],f[i-1][k]+graph[i][j-k]);

再根据这个,对于path数组的更新操作进行一些微调,即可得到满分程序了:

#include <bits/stdc++.h>
using namespace std;
int a[25][25];
int f[25][25];
int path[25][25][25];
int n,m;
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
scanf("%d",&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][k]+a[i][j-k]){
f[i][j]=f[i-1][k]+a[i][j-k];
for (int l=1;l<i;l++)
path[i][j][l]=path[i-1][k][l];
path[i][j][i]=j-k;
}
}
printf("%d\n",f[n][m]);
for (int i=1;i<=n;i++)printf("%d %d\n",i,path[n][m][i]);
return 0;
}

P2066 机器分配 解析的更多相关文章

  1. Luogu P2066 机器分配(dp)

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

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

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

  3. 洛谷 p2066 机器分配(资源型)

    机器分配 https://www.luogu.org/problem/show?pid=2066 题目描述 总公司拥有高效设备M台,准备分给下属的N个分公司.各分公司若获得这些设备,可以为国家提供一定 ...

  4. P2066 机器分配 DP

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

  5. [洛谷P2066]机器分配

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

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

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

  7. P2066 机器分配

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

  8. 洛谷 P2066 机器分配

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

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

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

随机推荐

  1. VMware中Linux虚拟机与Windows主机共享文件夹

    VMware下Linux虚拟机与Windows主机共享文件夹 1. 安装vm-tool 2. 开启共享文件夹 虚拟机->设置->选项->共享文件夹"右边选择"总是 ...

  2. WPF实现Win10汉堡菜单

    WPF开发者QQ群: 340500857  | 微信群 -> 进入公众号主页 加入组织 前言 有小伙伴提出需要实现Win10汉堡菜单效果. 由于在WPF中没有现成的类似UWP的汉堡菜单,所以我们 ...

  3. 苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功

    苹果应用内购 ios 开发者根据用户提供的邮件中的订单号查看该订单是否支付成功 这是苹果wwdc2021 推出的新功能 参考官网链接 App Store Server API | Apple Deve ...

  4. noj -> 跳马

    00 题目 描述: 在国际象棋中,马的走法与中车象棋类似,即俗话说的"马走日",下图所示即国际象棋中马(K)在一步能到达的格子(其中黑色的格子是能到达的位置). 现有一200*20 ...

  5. 【UE4】读写 Texture 数据

    创建texture 方式一 void AActor_Assignment2::TextureFromImage_Internal( const TArray<FColor>& Sr ...

  6. Scrum Meeting 0605

    零.说明 日期:2021-6-5 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 困难 qsy PM&前端 暂无 重新设 ...

  7. oo第二次博客-三次电梯调度的总结与反思

    本单元从电梯调度相关问题层层深入,带领我们学习并运用了了多线程相关的知识. 三次电梯调度依次为单电梯单容量.单电梯可携带.多电梯可携带. 一.我的设计 在第一次作业中,使用了最简单的FIFO调度方法. ...

  8. oracle物化视图创建及删除

    --删除物化表的日志表 DROP MATERIALIZED VIEW LOG ON 表名; --为将要创建物化视图的表添加带主键的日志表 CREATE MATERIALIZED VIEW LOG ON ...

  9. (转载)关于Linux C函数strtok的使用要点

    今天遇到了处理字符串的问题,比如分割问题,但是一时间想不起来什么方法,也不想手写一个类似java String中的split函数,于是百度了一下,发现了strtok这个好用的方法,以此作为总结. st ...

  10. hdu 2795 Billboard(单点更新,区间查询)

    题意: h*w的白板. 有n个广告牌,每个广告牌是1*wi.必须放置在白板的upmost中的leftmost. 输出n个广告牌放置在第几行.如果放不下,输出-1. 数据规格: h, w, and n ...