题目描述
总公司拥有高效设备 M 台,准备分给下属的 N 个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这 M 台设备才能使国家得到的盈利最大?求出最大盈利值。其中 M≤15,N≤10。分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数 M。
输入
第一行有两个数,第一个数是分公司数 N,第二个数是设备台数 M。一个 N*M 的矩阵,表明了第 I 个公司分配 J 台机器的盈利。
输出
第一行为最大盈利值,接下来 n 行,每行第一个数为公司编号,第二个数为公司分配的机器数。
若题目存在多解,编号越大的公司应优先分得越多的机器。
样例数据
输入 #1 复制
3 3 30 40 50 20 30 50 20 25 30
输出 #1 复制
70 1 1 2 1 3 1
#include<bits/stdc++.h>
using namespace std;
int s(int,int);
int maxx,f[50][50],v[50][50];
int main()
{
int m,n,i,j,k;
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>v[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
maxx=0;
for(k=0;k<=j;k++)
if(f[i-1][k]+v[i][j-k]>maxx)
maxx=f[i-1][k]+v[i][j-k];
f[i][j]=maxx;
}
cout<<f[n][m]<<endl;
s(n,m);
}
int s(int i,int j)
{
int k;
if(i==0)
return 0;
for(k=0;k<=j;k++)
if(maxx==f[i-1][k]+v[i][j-k])
{
maxx=f[i-1][k];
s(i-1,k);
cout<<i<<" "<<j-k<<endl;
break;
}
}