P2066-机器分配

P2066-机器分配(洛谷)

难度等级:普及/提高+
机器分配题目连接

好吧,这是我第一次写题解,然后如果有错的还请大佬轻喷

题目描述

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

输入格式

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

输出格式

第1行为最大盈利值
第2到第n为第i分公司分x台
P.S.要求答案的字典序最小

输入输出样例

输入

3 3
30 40 50
20 30 50
20 25 30

输出

70
1 1
2 1
3 1

这道题就是简单的dp
啥也不说上代码(注释在代码里,应该很好理解)

#include //万能头
using namespace std;
long maxl,f[11][20],value[11][20];
int show(int i,int j) //自定义函数
//目的是输出各分公司的分配情况
{
 int k;
 if(i==0)
   return 0;
 for(k=0;k<=j;k++)
   if(maxl==f[i-1][k]+value[i][j-k])
   //递归求各公司分配的机器数量
     {
      maxl=f[i-1][k];
      show(i-1,k);
      cout<<i<<" "<<j-k<<endl;
      break;
	 }
}
int main()
{
 long m,n,i,j,k;
 cin>>n>>m;
 for(i=1;i<=n;i++)
   for(j=1;j<=m;j++)
     cin>>value[i][j];
 for(i=1;i<=n;i++)
   {
   	for(j=1;j<=m;j++)
   	  {
   	   maxl=0;
   	   for(k=0;k<=j;k++)
   	     {
   	      if(f[i-1][k]+value[i][j-k]>maxl)
   	        maxl=f[i-1][k]+value[i][j-k];
		 }
	   f[i][j]=maxl;
	  }
   }
 cout<<f[n][m]<<endl; //输出最大盈利值
 show(n,m); //输出分配情况
} 
OK,这道题成功AC了P2066-机器分配_第1张图片

然后这道题我参考了一下 信息学奥赛一本通
原因是我比较懒【自动狗头】
如有雷同,纯属巧合

就这样,拜

你可能感兴趣的:(P2066-机器分配)