您的位置:首页 > 其它

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

2017-01-31 14:51 211 查看
机器分配

https://www.luogu.org/problem/show?pid=2066

题目描述

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

输入输出格式

输入格式:

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

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

输出格式:

第1行为最大盈利值

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

输入输出样例

输入样例#1:

33
304050
203050
202530


输出样例#1:

70
11
21
31
令f[i][j]表示前i个公司分配j台机器的最大盈利
枚举前i-1个公司分配k台机器
转移方程:f[i][j]=max(f[i-1][j-k]+w[i][k])
初始化:f[1][i]=w[1][i]
方案的输出用递归,用类似于转移方程的形式查找。
注意可能有多组解的情况,不注意第二个点过不去,多组解按字典序大的公司多分配输出可AC


#include<cstdio>
usingnamespacestd;
intw[11][16],f[11][16],n,m,d;
voidsolution(inti,intj)
{
if(!i)return;
for(intk=j;k>=0;k--)
if(f[i-1][j-k]+w[i][k]==d)
{
d=f[i-1][j-k];
solution(i-1,j-k);
printf("%d%d\n",i,k);
break;
}
}
intmain()
{
scanf("%d%d",&n,&m);
for(inti=1;i<=n;i++)
for(intj=1;j<=m;j++)
scanf("%d",&w[i][j]);
for(inti=1;i<=m;i++)f[1][i]=w[1][i];
for(inti=2;i<=n;i++)
for(intj=1;j<=m;j++)
for(intk=0;k<=j;k++)
if(f[i-1][j-k]+w[i][k]>f[i][j])
f[i][j]=f[i-1][j-k]+w[i][k];
printf("%d\n",f
[m]);
d=f
[m];
solution(n,m);
}


错因:g[i]=记录的是前i个公司可得到的最大盈利,前i个最大不代表i+1最大
#include<cstdio>
#include<algorithm>
usingnamespacestd;
intw[11][16],f[11][16],n,m,g[11];
intmain()
{
scanf("%d%d",&n,&m);
for(inti=1;i<=n;i++)
for(intj=1;j<=m;j++)
scanf("%d",&w[i][j]);
for(inti=1;i<=m;i++)f[1][i]=w[1][i];
for(inti=2;i<=n;i++)
for(intj=1;j<=m;j++)
for(intk=1;k<=j;k++)
if(f[i-1][j-k]+w[i][k]>f[i][j])
{
f[i][j]=f[i-1][j-k]+w[i][k];
g[i]=k;
}
printf("%d\n",f
[m]);
for(inti=2;i<=n;i++)m-=g[i];
printf("1%d\n",m);
for(inti=2;i<=n;i++)printf("%d%d\n",i,g[i]);
}


错误代码


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: