题目描述

总公司拥有高效设备M台,准备分给下属的N个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。其中M≤15,N≤10。分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。

输入输出格式

输入格式:

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

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

输出格式:

第1行为最大盈利值

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

P.S.要求答案的字典序最小

输入输出样例

输入样例#1:

3 3
30 40 50
20 30 50
20 25 30
输出样例#1:

70
1 1
2 1
3 1
分析:dp(i,j)表示前I个公司一共选J台机器的最优答案,那转移方程为dp(i,j)=max(dp(i-1,j-k);这个方程表示如果我们第I选择了J台,那应该是从i-1次中选择K台才得出的答案;
那么如何输出字典序最小呢?我们可以使用pa(i,j,h) 表示前i个公司一共选j台机器,h号公司选了多少台;
#include<bits/stdc++.h>
using namespace std;
int f[][],graph[][],path[][][],n,m;
int main()
{
cin>>n>>m;
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
cin>>graph[i][j];
}
memset(f,,sizeof(f));
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int k=;k<=j;k++)
{
if (f[i][j]<f[i-][j-k]+graph[i][k])
{
f[i][j]=f[i-][j-k]+graph[i][k];
for(int h=;h<i;h++) path[i][j][h]=path[i-][j-k][h];//path数组只有在状态发生转移时才更新
path[i][j][i]=k;
}
}
cout<<f[n][m]<<endl;
for(int i=;i<=n;i++) cout<<i<<" "<<path[n][m][i]<<endl;
return ;
}

但是!!!!!!!这并不可以AC 因为还有个限制条件那就是字典序最小,我们怎么解决呢??

按上面这种方式的枚举,我们都是尽可能的选满填充所以得出的字典序可能是最大的,那我们可以尽可能的不选满,那就是意味着我们要倒叙的枚举

#include<stdio.h>
#include<string.h>
int mo[][],dp[][],pa[][][];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i= ; i<=n ; i++)
for(int j= ; j<=m ; j++)
scanf("%d",&mo[i][j]);
memset(dp,,sizeof(dp));
for(int i= ; i<=n ; i++)
{
for(int j= ; j<=m ; j++)
{
for(int k= ; k<=j ; k++)
{
if(dp[i][j]<dp[i-][k]+mo[i][j-k])
{
dp[i][j]=dp[i-][k]+mo[i][j-k];
for(int h= ; h<i ; h++)
pa[i][j][h]=pa[i-][k][h];
pa[i][j][i]=j-k;
}
}
}
}
printf("%d\n",dp[n][m]);
for(int i= ; i<=n ; i++)
printf("%d %d\n",i,pa[n][m][i]);
return ;
}

这里给的数据很小,如果数据大的话,有个空间优化

#include <iostream>

using namespace std;

int f[],n,m,w[][],ans[][];

int main()
{
int i,j,k; cin>>n>>m; for (i=;i<=n;++i)
{
for (j=;j<=m;++j)
{
cin>>w[i][j];
}
} for (i=n;i>;--i)
{
for (j=m;j>=;--j)
{
for (k=;k<=j;++k)
{
if (f[j-k]+w[i][k]>f[j])
{
f[j]=f[j-k]+w[i][k];
ans[i][j]=k; //保存f(i,j)取最大时k的值
}
}
}
} cout<<f[m]; for (i=,j=m;i<=n;++i)
{
cout<<endl<<i<<" "<<ans[i][j];
j-=ans[i][j]; //算出最优方案第i+1~n公司共使用了几台机器,也就是f(i,j)是由f(i+1,?)转移过来的
} return ;
}

P2066 机器分配 (DP+DP输出)的更多相关文章

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

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

  2. Luogu P2066 机器分配(dp)

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

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

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

  4. P2066 机器分配 解析

    小日记: 1.今天新学的字体颜色,尽管不熟悉,但玩的666,卡星(开心) ╰( ̄▽ ̄)╮╰( ̄▽ ̄)╮╰( ̄▽ ̄)╮╰( ̄▽ ̄)╮╰( ̄▽ ̄)╮╰( ̄▽ ̄)╮ 2.今天油腔滑调,谅解亿下 P2066 ...

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

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

  6. 机器分配----线性dp难题(对于我来说)

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

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

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

  8. P2066 机器分配 DP

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

  9. [洛谷P2066]机器分配

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

随机推荐

  1. C#中如何获取一个二维数组的两维长度,即行数和列数?以及多维数组各个维度的长度?

    如何获取二维数组中的元素个数呢? int[,] array = new int[,] {{1,2,3},{4,5,6},{7,8,9}};//定义一个3行3列的二维数组int row = array. ...

  2. C# 中常用LInq操作

    static void Main(string[] args) { , , , , , , }; , , , , , , }; , , , , , , , , , , , }; // 交集 var f ...

  3. 【java并发编程艺术学习】(四)第二章 java并发机制的底层实现原理 学习记录(二) synchronized

    章节介绍 本章节主要学习 Java SE 1.6 中为了减少获得锁 和 释放锁 时带来的性能消耗 而引入的偏向锁 和 轻量级锁,以及锁的存储结构 和 升级过程. synchronized实现同步的基础 ...

  4. viewstate的基本用法

    转自:http://www.cnblogs.com/ooip/p/4743536.html 在web窗体将控件属性设置为runat=server时,这个控件会被添加一个隐藏属性_ViewState,_ ...

  5. hibernate&nbsp;hql&nbsp;查询指定…

    以数组的形式抛出,前台页面就要把它当成一个数组来处理 以对象抛出,就要当成一个对象来处理. 在JSP页面使用标签时一定要注意这点. 版权声明:本文为博主原创文章,未经博主允许不得转载.

  6. 17、SAM文件格式说明(转载迷宫中的将军)

    1. SAM格式说明 SAM代表Sequence Alignment/Map格式,是一种制表符分隔的文本格式,包含一个可选的头部分(header section,有人称之为“注释部分”),和一个比对部 ...

  7. hdu1068

    #include<stdio.h>#include<string.h>const int MAXN=1000;int map[MAXN][MAXN];int n;int lin ...

  8. C#的递归函数

    我的理解:函数内部把自己当另一个函数来调用 其实还是调用的他自己 递归函数必须有结束条件,否则就是死循环

  9. Instruments10 分析某个类中方法的执行时间

    此步骤也可用户内存分配.内存泄漏的检测 最新操作步骤参考: https://www.jianshu.com/p/e499ce63ed72

  10. 【mybatis 的foreach的用法】

    foreach一共有三种类型,分别为List,[](array),Map三种. foreach属性 属性 描述 item 循环体中的具体对象.支持属性的点路径访问,如item.age,item.inf ...