luogu p2066 机器分配
wow 很有意思的题欸;
做做就知道了
关键是我犯了一个
很
傻*
的问题
我把J当作了机器的下标
然后做了N遍 都没过
由此可以看出
认真读题的重要性啊啊啊啊啊
好了 废话不多说
开始分析题
以下是有用的
要将M台设备分给N个公司
按照公司的顺序来分配机器,即按照公司的顺序划分阶段,第一个阶段把M台设备分给第一个公司,记录下来获得的各个盈利值,然后把M台设备分给前两个公司,和第一个阶段比较记录下来更优的各个盈利值,一直到第N个阶段把M台机器全部分给了N个公司,就可以得到最优解,下面来讨论两个阶段之间的关系,设数组F[I][J]表示前I个公司分配J台机器的最大盈利,数组F[I-1][K]表示前I-1个公司分配K台机器的最大盈利(1≤I≤N,1≤J≤M,0≤K≤J),用Value[I][J]表示第I个公司分配 J台机器的盈利, 则F[I][J]可以由下面的式子中取最大值获得:
F[I-1][0]+Value[I][J] //前I-1公司分配0台机器最大盈利+第I个公司分配J台的机器的盈利
F[I-1][1]+Value[I][J-1] //前I-1公司分配1台机器最大盈利+第I个公司分配J-1台的机器的盈利
F[I-1][2]+Value[I][J-2] //前I-1公司分配2台机器最大盈利+第I个公司分配J-2台的机器的盈利
F[I-1][J-1]+Value[I][1] //前I-1公司J-1分配台机器最大盈利+第I个公司分配1台的机器的盈利
F[I-1][J]+Value[I][0] //前I-1公司分配J台机器最大盈利+第I个公司分配0台的机器的盈利
```
]
#include<iostream>
#include<cstring>
using namespace std;
int maxn,f[1001][1001],value[1001][1001], n, m;
inline int show(int i, int j) {
if (i == 0) return 0;
for (int k = 0; k <= j; k++) {
if (maxn == f[i - 1][k] + value[i ][j - k])
{
maxn = f[i - 1][k];
show(i - 1, k);
cout << i << " " << j - k << endl;
break;
}
}
}
int main() {
cin >> n >> m;
int i, j,k;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
cin >> value[i][j];
for(i=1;i<=n;i++)
for (j = 1; j <= m; j++) {
maxn = 0;
for (k = 0; k <= j; k++)
{
if (f[i - 1][k] + value[i ][j - k] > maxn)
maxn = f[i - 1][k] + value[i ][j - k];
}
f[i][j] = maxn;
}
cout << f[n][m] << endl;
show(n, m);
return 0;
}