总公司拥有高效生产设备M台,准备分给下属的N个公司。各分公司若获得这些设备,可以为国家提供一定的盈利。
问:
如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。其中M<=15,N<=10。分配原则:每个公司有权获得任意数目的设备,但总台数不得超过总设备数M。
数据文件格式为:第一行保存两个数,第一个数是设备台数M,第二个数是分公司数N。接下来是一个M*N的矩阵,表明了第I个公司分配J台机器的盈利。
如令M=8,N=4
矩阵为
1 | 3 | 5 | 7 | 7 | 10 | 11 | 11 |
2 | 2 | 4 | 5 | 6 | 8 | 9 | 12 |
1 | 4 | 4 | 6 | 8 | 8 | 12 | 15 |
3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 |
用P(i,j)表示 j台设备分配给前(如果把这个“前”字去掉下面状态转移方程就很难理解了)i个子公司的盈利最大的情形,上述的矩阵为table[M+1][N+1],为描述和编码方便,从[1][1]开始存值
用分配出去的机器数表示状态
转移方程为:
P[i,j]=max(P[i-1,j-k]+table[i][k])
初始状态为:
P[i,0]=0
p[0,j]=0
#include<bits/stdc++.h>
using namespace std;
int f[2505][2505],a[2505][2505],m,n;
int main() {
cin>>n>>m;
for(int i=1; i<=n; i++) for(int j=1; j<=m; j++) cin>>a[i][j];
memset(f,-1,sizeof(f));
for(int i=0; i<=n; i++) f[i][0]=0;
for(int i=0; i<=n; i++) for(int j=0; j<=m; j++) if(f[i][j]!= -1) for(int k=0; k<=m-j; k++) if(j+k<=m&&i+1<=n) f[i+1][j+k]=max(f[i+1][j+k],f[i][j]+a[i+1][k]);
cout<<f[n][m];
return 0;
}