【題目描述】
總公司擁有高效設備M臺,準備分給下屬的N個分公司。各分公司若獲得這些設備,可以爲國家提供一定的盈利。問:如何分配這M臺設備才能使國家得到的盈利最大?求出最大盈利值。其中M≤15,N≤10。分配原則:每個公司有權獲得任意數目的設備,但總檯數不超過設備數M。
【輸入】
第一行有兩個數,第一個數是分公司數N,第二個數是設備臺數M;
接下來是一個N*M的矩陣,表明了第 I個公司分配 J臺機器的盈利。
【輸出】
第一行輸出最大盈利值;
接下N行,每行有2個數,即分公司編號和該分公司獲得設備臺數。
【輸入樣例】
3 3 //3個分公司分3臺機器 30 40 50 20 30 50 20 25 30
【輸出樣例】
70 //最大盈利值爲70 1 1 //第一分公司分1臺 2 1 //第二分公司分1臺 3 1 //第三分公司分1臺
//Created on 2020/2/17
#include<bits/stdc++.h>
using namespace std;
const int idata=100+5;
const int maxn=0x3f3f3f3f;
long maps[idata][idata];
//long judge[idata][idata];
int record[idata][idata];
int cnt[idata][idata];
//int delta[2][2]={{1,0},{0,1}};
int flag[idata][idata];
long maxx;
int n,m;
inline void print(int x,int y)
{
if(x==0)
return ;
print(x-1,y-flag[x][y]);
cout<<x<<" "<<flag[x][y]<<endl;
}
int main()
{
register int i,j,k;
cin>>n>>m;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
cin>>maps[i][j];
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
for(k=0;k<=j;k++)
{
if(record[i][j]<record[i-1][k]+maps[i][j-k])
{
record[i][j]=record[i-1][k]+maps[i][j-k];
flag[i][j]=j-k;
}
}
}
}
cout<<record[n][m]<<endl;
print(n,m);
return 0;
}