写了3个小时终于过了,这道题让我进一步了解和掌握了动态规划,呵呵:-)
 #include<iostream>
#include<iostream>
 #include<cstdio>
#include<cstdio>
 #include<algorithm>
#include<algorithm>
 using namespace std;
using namespace std;
 #define offset ((20*m))
#define offset ((20*m))

 int f[100][2000];
int f[100][2000];
 int path[100][2000];
int path[100][2000];

 int minu[400];
int minu[400];
 int plus[400];
int plus[400];

 int a[400];
int a[400];
 int b[400];
int b[400];
 int n,m;
int n,m;

 #define max(a,b) ((a>b?a:b))
#define max(a,b) ((a>b?a:b))
 bool check(int i,int n,int m)
bool check(int i,int n,int m)


 {
{
 while(true)
    while(true)

 
     {
{

 if(i==path[n][m])
        if(i==path[n][m])
 return true;
            return true;
 if(n==0)
        if(n==0)
 break;
            break;
 m-=minu[path[n][m]];
        m-=minu[path[n][m]];
 n-=1;
        n-=1;
 
        
 }
    }
 return false;
    return false;
 }
}
 int record[1000];
int record[1000];


 int main()
int main()


 {
{
 int i,j,k;
    int i,j,k;
 int testcase=0;
    int testcase=0;
 while(scanf("%d%d",&n,&m))
    while(scanf("%d%d",&n,&m))

 
     {
{
 testcase++;
        testcase++;
 memset(path,-1,sizeof(path));
        memset(path,-1,sizeof(path));
 memset(f,-1,sizeof(f));
        memset(f,-1,sizeof(f));
 if(n==0&&m==0)
        if(n==0&&m==0)
 break;
            break;
 for(i=1;i<=n;i++)
        for(i=1;i<=n;i++)

 
         {
{
 scanf("%d%d",&a[i],&b[i]);
            scanf("%d%d",&a[i],&b[i]);
 minu[i]=a[i]-b[i];
            minu[i]=a[i]-b[i];
 plus[i]=a[i]+b[i];
            plus[i]=a[i]+b[i];
 }
        }
 for(i=1;i<=n;i++)
        for(i=1;i<=n;i++)

 
         {
{
 if(plus[i]>=f[1][minu[i]+offset])
                if(plus[i]>=f[1][minu[i]+offset])

 
                 {
{

 f[1][minu[i]+offset]=plus[i];
                    f[1][minu[i]+offset]=plus[i];
 path[1][minu[i]+offset]=i;
                    path[1][minu[i]+offset]=i;
 }
                }
 }
        }

 for(i=1;i<m;i++)
        for(i=1;i<m;i++)

 
         {
{
 for(j=0;j<=offset*2;j++)
            for(j=0;j<=offset*2;j++)

 
             {
{
 for(k=1;k<=n;k++)
                for(k=1;k<=n;k++)

 
                 {
{
 if(f[i][j]>=0)
                    if(f[i][j]>=0)

 
                     {
{
 if(!check(k,i,j))
                        if(!check(k,i,j))

 
                         {
{
 if(f[i][j]+plus[k]>=f[i+1][j+minu[k]])
                            if(f[i][j]+plus[k]>=f[i+1][j+minu[k]])
 path[i+1][j+minu[k]]=k;
                                path[i+1][j+minu[k]]=k;
 f[i+1][j+minu[k]]=max(f[i+1][j+minu[k]],f[i][j]+plus[k]);
                            f[i+1][j+minu[k]]=max(f[i+1][j+minu[k]],f[i][j]+plus[k]);
 
                            
 }
                        }
 }
                    }



 }
                }
 }
            }
 }
        }
 
        
 int mark;
        int mark;
 for(i=0;i<=20*m;i++)
        for(i=0;i<=20*m;i++)

 
         {
{
 if(  f[m][20*m+i]!=-1  ||  f[m][20*m-i]!=-1 )
            if(  f[m][20*m+i]!=-1  ||  f[m][20*m-i]!=-1 )

 
             {
{
 mark=20*m+i;
                mark=20*m+i;
 if(f[m][20*m+i]>=f[m][20*m-i])
                if(f[m][20*m+i]>=f[m][20*m-i])

 
                 {
{
 mark=20*m+i;
                    mark=20*m+i;
 }
                }
 if(f[m][20*m+i]<f[m][20*m-i])
                if(f[m][20*m+i]<f[m][20*m-i])

 
                 {
{
 
                    
 mark=20*m-i;
                    mark=20*m-i;
 }
                }
 break;
                break;
 
                
 }
            }
 }
        }
 int t,tt;
        int t,tt;
 t=m;
        t=m;
 tt=mark;
        tt=mark;
 for(i=1;i<=m;i++)
        for(i=1;i<=m;i++)

 
         {
{
 record[i]=path[t][tt];
            record[i]=path[t][tt];
 t-=1;
            t-=1;
 tt-=minu[record[i]];
            tt-=minu[record[i]];
 }
        }
 sort(record+1,record+1+m);
        sort(record+1,record+1+m);

 int suma=0;
        int suma=0;
 int sumb=0;
        int sumb=0;
 for(i=1;i<=m;i++)
        for(i=1;i<=m;i++)

 
         {
{

 suma+=a[record[i]];
            suma+=a[record[i]];
 sumb+=b[record[i]];
            sumb+=b[record[i]];
 }
        }
 printf("Jury #%d\nBest jury has value %d for prosecution and value %d for defence:\n",testcase,suma,sumb );
        printf("Jury #%d\nBest jury has value %d for prosecution and value %d for defence:\n",testcase,suma,sumb );
 for(i=1;i<=m;i++)
        for(i=1;i<=m;i++)
 printf(" %d",record[i]);
            printf(" %d",record[i]);
 printf("\n\n");
        printf("\n\n");
 }
    }
 return 0;
    return 0;
 }
}
