题目传送门
解题思路:
f[i][j]表示前i个公司分j台机器的最大盈利值,既然答案要求字典序最小,那我就从后面往前处理其实没多大关系,
f[i][j]=max(f[i][j],f[i+1][j-k] + a[i][k]),k为第i家公司分的机器数.然后发现第一维可以滚掉,那就滚掉.
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 4 using namespace std; 5 6 int n,m,a[20][20],ans[20][20],f[20]; 7 8 int main() { 9 scanf("%d%d",&n,&m); 10 for(int i = 1;i <= n; i++) 11 for(int j = 1;j <= m; j++) 12 scanf("%d",&a[i][j]); 13 for(int i = n;i >= 1; i--) 14 for(int j = m;j >= 1; j--) 15 for(int k = 1;k <= j; k++) 16 if(f[j-k] + a[i][k] > f[j]) { 17 f[j] = f[j-k] + a[i][k]; 18 ans[i][j] = k; 19 } 20 printf("%d ",f[m]); 21 for(int i = 1;i <= n; i++) { 22 printf("%d %d ",i,ans[i][m]); 23 m -= ans[i][m]; 24 } 25 return 0; 26 }