jury compromise

/*Code by Codercjh*/
/*time  80ms*/
/*status  Accepted*/
/*problem jury compromise*/
#include<bits/stdc++.h>
#define fr(i,a,b) for(int i=(a);i<=(b);++i)
#define rf(i,a,b) for(int i=(a);i>=(b);--i)
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
using namespace std;
typedef long long ll;
template<typename T>
inline void read(T &x){
    char c=getchar();T fh=0;bool f=false;
    while(!isdigit(c))f|=(c=='-'),c=getchar();
    while(isdigit(c))fh=(fh<<1)+(fh<<3)+(c^48),c=getchar();
    x=f?-fh:fh;
    return;
}

int sump,sumd,cnt,ans[205],d[205][25][805],a[205],b[205],f[25][805],n,m,kase;
void print(int i,int j,int k){
    if(j)print(d[i][j][k]-1,j-1,k-(a[d[i][j][k]]-b[d[i][j][k]])),ans[++cnt]=d[i][j][k];
    else return;
}
int main(){
    read(n),read(m);
    while(n&&m){
        fr(i,1,n)read(a[i]),read(b[i]);
        memset(f,0xcf,sizeof(f));f[0][400]=0;
        fr(i,1,n){
         fr(j,1,m)
          fr(k,0,800)
           d[i][j][k]=d[i-1][j][k];
         rf(j,m,1)
          fr(k,0,800){
           if(!(k-(a[i]-b[i])<0||k-(a[i]-b[i])>800)&&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 ansi=1e9;
        fr(i,0,400){
            if(f[m][400+i]>=0&&f[m][400-i]<=f[m][400+i]){
                ansi=400+i;
                break;
            }
            else 
             if(f[m][400-i]>=0){
                 ansi=400-i;
                 break;
             }
        }
        sump=sumd=cnt=0;
        print(n,m,ansi);
        fr(i,1,cnt)sump+=a[ans[i]],sumd+=b[ans[i]];
        printf("Jury #%d\nBest jury has value %d for prosecution and value %d for defence:\n",++kase,sump,sumd);
        fr(i,1,cnt)printf(" %d",ans[i]);puts("\n");
        read(n),read(m);
    }
    return 0;
} 

 

posted @ 2019-12-15 22:40  Coder_cjh  阅读(228)  评论(0编辑  收藏  举报