poj 1015(dp)

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int dp[21][801],path[21][801];
int p[201],d[201],s[201],v[201];
int id[21];
bool select(int j,int k,int i){
    while(j>0&&path[j][k]!=i){
        k -= v[path[j][k]];
        j--;
    }
    return (j!=0)?true:false;
}
int main(){
    int j,k,i,time=1;
    while(cin>>n>>m&&n!=0){
        for(i=1;i<=n;i++){
            cin>>p[i]>>d[i];
            s[i] = p[i]+d[i];
            v[i] = p[i]-d[i]; 
        }
        memset(dp,-1,sizeof(dp));
        memset(path,0,sizeof(path));
        int fix = m*20;
        dp[0][fix] = 0;
        for(j=1;j<=m;j++){
            for(k=0;k<=2*fix;k++){
                if(dp[j-1][k]>=0){
                    for(i=1;i<=n;i++){
                        if(!select(j-1,k,i)){
                            if(dp[j][k+v[i]]<dp[j-1][k]+s[i]){
                                dp[j][k+v[i]] = dp[j-1][k]+s[i];
                                path[j][k+v[i]] = i;
                            }
                        }
                    }
                }
            }
        }
        for(k=0;k<=2*fix;k++){
            if(dp[m][fix-k]>=0||dp[m][fix+k]>=0){
                break;
            }
        }
        int div = dp[m][fix-k]>dp[m][fix+k]?fix-k:fix+k;
        for(i=0,j=m,k=div;i<m;i++,j--){
            id[i] = path[j][k];
            k -= v[id[i]];
        } 
        sort(id,id+m);
//Jury #1 
//Best jury has value 6 for prosecution and value 4 for defence: 
// 2 3 
        cout<<"Jury #"<<time++<<endl;
        cout<<"Best jury has value "<<(dp[m][div]+div-fix)/2<<" for prosecution and value "<<(dp[m][div]-div+fix)/2<<" for defence:"<<endl;
        for(i=0;i<m;i++){
            cout<<" "<<id[i];
        }
        cout<<endl<<endl;
    }
    return 0;
}

 

posted @ 2021-07-24 20:46  智人心  阅读(31)  评论(0)    收藏  举报