题目背景
无
题目描述
总公司拥有高效设备M台,准备分给下属的N个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。其中M≤15,N≤10。分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数M。
输入输出格式
输入格式:第一行有两个数,第一个数是分公司数N,第二个数是设备台数M。
接下来是一个N*M的矩阵,表明了第 I个公司分配 J台机器的盈利。
输出格式:第1行为最大盈利值
第2到第n为第i分公司分x台
P.S.要求答案的字典序最小
输入输出样例
Solution:
一道简单的$DP$,本题很容易定义出状态$f[i][j]$表示前$i$个公司分配了$j$个机器的最大值,那么状态转移方程:$f[i][j]=max(f[i][j],f[i-1][k]+w[i][j-k]),k\in[0,j]$,至于输出方案,直接在每次更新后同步记录一下当前公司分配的个数,最后递归输出就$OK$了。
代码:
1 #include<bits/stdc++.h> 2 #define il inline 3 #define ll long long 4 #define Max(a,b) (a)>(b)?(a):(b) 5 #define f_for(a,b,i) for(int (i)=(a);(i)<=(b);(i)++) 6 using namespace std; 7 int n,m,a[25][25],cnt,f[25][25],path[25][25]; 8 il void print(int i,int j){ 9 if(!i)return; 10 print(i-1,j-path[i][j]); 11 cout<<i<<' '<<path[i][j]<<endl; 12 } 13 int main(){ 14 ios::sync_with_stdio(0); 15 cin>>n>>m; 16 f_for(1,n,i)f_for(1,m,j)cin>>a[i][j]; 17 f_for(1,n,i) f_for(1,m,j) f_for(0,j,k) 18 if(f[i-1][k]+a[i][j-k]>f[i][j])f[i][j]=f[i-1][k]+a[i][j-k],path[i][j]=j-k; 19 cout<<f[n][m]<<endl; 20 print(n,m); 21 return 0; 22 }