- 专题一 线性DP、背包
陪审团
- @ 2025-8-11 16:51:26
#include<bits/stdc++.h>
using namespace std;
const int N = 210, M = 810, P = 400;
int f[N][25][M];
int p[N], d[N];
int res[N], cnt;
int n, m;
int main()
{
int cntt = 0;
while(cin >> n >> m, n || m)
{
for(int i = 1; i <= n; i++)
cin >> p[i] >> d[i];
cnt = 0;
memset(f, -0x3f, sizeof f);
f[0][0][P] = 0;
for(int i = 1; i <= n; i++)
for(int j = 0; j <= m; j ++)
for(int k = 0; k < M; k++)
{
f[i][j][k] = f[i - 1][j][k];
int v = k - (p[i] - d[i]);
if(j - 1 >= 0 && v >= 0 && v <= 800)
f[i][j][k] = max(f[i][j][k], f[i - 1][j - 1][v] + p[i] + d[i]);
}
int x = 0;
while(f[n][m][P + x] < 0 && f[n][m][P - x] < 0) x ++;
if(f[n][m][P + x] < f[n][m][P - x]) x = P - x;
else x = P + x;
int i = n, j = m;
while(j)
{
if(f[i][j][x] == f[i - 1][j][x]) i --;
else {
res[ ++ cnt] = i;
x -= p[i] - d[i];
i--, j--;
}
}
int sump = 0, sumd = 0;
for(int i = 1; i <= cnt; i++)
{
sump += p[res[i]];
sumd += d[res[i]];
}
cout << "Jury #" << ++ cntt << endl;
cout << "Best jury has value " << sump <<" for prosecution and value " <<sumd<< " for defence:" << endl;
sort(res + 1, res + 1 + cnt);
for (int i = 1; i <= cnt; i ++ ) cout << ' ' << res[i];
cout << endl << endl;
}
return 0;
}
0 条评论
目前还没有评论...