救救孩子吧,被卡了快两天了...或者给组hack也行
#include<bits/stdc++.h>
using namespace std;
int n,m,p[205],q[205];
int dp[205][25][805];
int d[205][25][805];
pair<int,int>fr[205][25][805];
const int D=400,M=800;
stack<int>met;
void getans(int k,int i,int j){
if(d[k][i][j]<=0)return;
met.push(d[k][i][j]);
getans(d[k][i][j]-1,i-1,j-p[d[k][i][j]]+q[d[k][i][j]]);
}
int main(){
//File(1,1);
for(int T=1;;T++){
cin>>n>>m;
if(n==0)break;
for(int i=1;i<=n;i++)cin>>p[i]>>q[i];
memset(d,-1,sizeof d);
memset(dp,-1,sizeof dp);
memset(fr,0,sizeof fr);
dp[0][0][D]=0;
for(int k=1;k<=n;k++){//当前考虑的物品编号
for(int i=0;i<=m;i++){
for(int j=0;j<=M;j++){
d[k][i][j]=d[k-1][i][j];
}
}
for(int i=min(k-1,m);i>=0;i--){//空间
int del=p[k]-q[k];
for(int j=0;j<=M;j++){
if(dp[k-1][i][j]<0)continue;
int nx=j+del;
if(nx<0 or nx>M)continue;
d[k][i][j]=d[k-1][i][j];
dp[k][i][j]=dp[k-1][i][j];
fr[k][i][j]={fr[k-1][i][j].first,fr[k-1][i][j].second};
if(dp[k-1][i][j]+p[k]+q[k]>dp[k][i+1][nx]){
dp[k][i+1][nx]=dp[k-1][i][j]+p[k]+q[k];
fr[k][i+1][nx]={fr[k-1][i][j].first+p[k],fr[k-1][i][j].second+q[k]};
d[k][i+1][nx]=k;
}
}
}
}
int ans=(int)1e9,ant;
for(int i=0;i<=M;i++){
if(dp[n][m][i]<=0)continue;
if(abs(i-D)<ans or(abs(i-D)==ans and dp[n][m][i]>=dp[n][m][ant])){ans=abs(i-D),ant=i;}
}
getans(n,m,ant);
printf("Jury #%d\n",T);
printf("Best jury has value %d for prosecution and value %d for defence:\n",fr[n][m][ant].first,fr[n][m][ant].second);
while(met.size())printf(" %d",met.top()),met.pop();
printf("\n\n");
}
}