原题:
已知第j个公司使用k台机器时,能得到的利润为a[j,k],问如何将m台机器在n个公司中分配,才能获得最大利润?要求输出能获得的最大利润及方案.将3台机器分配给2个公司能获得的盈利情况如下:
最大盈利为6,方案为公司2使用2台,公司1使用1台.
第1行n,m 分别表示公司数和机器数 第2至第n+1行分别表示第i个公司分别使用每台机器的盈利情况,可结合题目描述进行理解。
最大的盈利值为多少
2 3
2 3 4
1 4 5
6
#include<bits/stdc++.h>
using namespace std;
long long a[450][450],n,m,f[10000005],f2[10000005],sum=0;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++){
cin>>a[i][j];
sum+=a[i][j];
}
memset(f,-1,sizeof(f));
f[0]=0;
for(int i=0;i<m-1;i++)
for(int j=0;j<n-1;j++)
for(int k=sum;k>=0;k--){
if(f[k]!=-1)
if(f[k+a[i][j]]==-1||a[m-i-2][j]+a[i][j]>k+a[i][j]){
f[k+a[i][j]]=a[i][j]+a[m-i-2][j],f2[k+a[i][j]]=i+j+2;/*cout<<i<<' '<<j<<' '<<m-i-2<<' '<<a[i][j]<<' '<<a[m-i-2][j]<<'\n';*/
}
}
long long max=0;
for(int i=0;i<=sum;i++)
if(f2[i]==m&&f[i]>max)max=f[i];
cout<<max;
}