洛谷 P2066 机器分配

题目传送门

解题思路:

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 }
原文地址:https://www.cnblogs.com/lipeiyi520/p/12319685.html