usingnamespace std; constint N=210,M=810,bios=400; int f[N][22][M]; //因为要记录具体方案,不能用滚动数组 int p[N],d[N]; int ans[N],cnt,n,m;
intmain(){ int T=1; while(scanf("%d%d",&n,&m),n||m){ cnt=0; for(int i=1;i<=n;i++) scanf("%d%d",&p[i],&d[i]); memset(f,-0x3f,sizeof(f)); f[0][0][bios]=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 t = k - (p[i] - d[i]); if (t < 0 || t >= M) continue; if (j < 1) continue; f[i][j][k] = max(f[i][j][k], f[i - 1][j - 1][t] + p[i] + d[i]); } int v=0; while(f[n][m][v+bios]<0&&f[n][m][bios-v]<0) v++; if(f[n][m][-v+bios]>f[n][m][v+bios]) v=bios-v; else v=bios+v; int x=n,y=m,k=v; while(y){ if(f[x][y][k] == f[x-1][y][k]) x--; else{ ans[cnt++]=x; k-=(p[x]-d[x]); x--,y--; } } int sp=0,sd=0; for(int i=0;i<cnt;i++) sp+=p[ans[i]],sd+=d[ans[i]]; printf("Jury #%d\n", T ++ ); printf("Best jury has value %d for prosecution and value %d for defence:\n", sp, sd);
sort(ans, ans + cnt); for (int i = 0; i < cnt; i ++ ) printf(" %d", ans[i]); printf("\n\n"); } }