描述
已知第j个公司使用k台机器时,能得到的利润为a[j,k],问如何将m台机器在n个公司中分配,才能获得最大利润?要求输出能获得的最大利润及方案.将3台机器分配给2个公司能获得的盈利情况如下:
最大盈利为6,方案为公司2使用2台,公司1使用1台.
输入
第1行n,m 分别表示公司数和机器数
第2至第n+1行分别表示第i个公司分别使用每台机器的盈利情况,可结合题目描述进行理解
机器数m<=300,
公司数n<=300;
最大总利润不超过longint范围
输出
最大的盈利值为多少
样例
输入
2 3
2 3 4
1 4 5
输出
6
解析
首先看题目,对于分配给前i个公司j台机器的价值,实际上相当于前i-1个公司分配k台机器并给第i个公司分配j-k台机器的价值总和,那么我们推出状态转移方程:
f[i][j]=max(f[i][j],f[i-1][j-k]+v[i][k]);
我们用递推的思想求出这个核心部分。
#include<iostream>
#include<cstdio>
using namespace std;
int n,m,v[1000][1000],f[1000][1000];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>v[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
for(int k=0;k<=j;k++){
f[i][j]=max(f[i][j],f[i-1][j-k]+v[i][k]);
}
}
}
cout<<f[n][m];
return 0;
}