Files
OI-source/7.1015.cpp
2023-08-03 09:22:52 +08:00

57 lines
1.3 KiB
C++

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int f[25][805];
int d[205][25][805];
int n,m,a[205],b[205],SA,SB,T;
vector<int> Q;
void GetPath(int i,int j,int k)
{
if(j==0) return;
int last=d[i][j][k];
GetPath(last-1,j-1,k-(a[last]-b[last]));
Q.push_back(last);
SA+=a[last]; SB+=b[last];
}
int main()
{
#ifdef local
freopen("pro.in","r",stdin);
#endif
while(scanf("%d%d",&n,&m)==2&&n)
{
for(int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
memset(f,0xcf,sizeof(f));
f[0][400]=0;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=m;j++) for(int k=0;k<=800;k++) d[i][j][k]=d[i-1][j][k];
for(int j=m;j;j--)
for(int k=0;k<=800;k++)
{
if(k-(a[i]-b[i])<0||k-(a[i]-b[i])>800) continue;
if(f[j][k]<f[j-1][k-(a[i]-b[i])]+a[i]+b[i])
{
f[j][k]=f[j-1][k-(a[i]-b[i])]+a[i]+b[i];
d[i][j][k]=i;
}
}
}
int res=0;
for(int k=0;k<=400;k++)
{
if(f[m][400+k]>=0&&f[m][400+k]>=f[m][400-k]) { res=k+400; break; }
if(f[m][400-k]>=0) { res=400-k; break; }
}
Q.clear();
SA=SB=0;
GetPath(n,m,res);
printf("Jury #%d\n",++T);
printf("Best jury has value %d for prosecution and value %d for defence:\n",SA,SB);
for(int i=0;i<Q.size();i++) printf(" %d",Q[i]);
printf("\n\n");
}
return 0;
}