poj 1015 Jury Compromise 01背包+输出方案

来源:互联网 发布:新开淘宝店没生意怎么办 编辑:程序博客网 时间:2024/06/07 14:02
//poj 1015//sep9#include<iostream>using namespace std;const int delta=400;int a[202],b[202];int dp[202][22][2*delta+10];int path[202][22][2*delta+10];int n,m;void print(int x,int y,int z){if(x==0)return ;if(path[x][y][z]==1){int d=a[x]-b[x];print(x-1,y-1,z-d);printf(" %d",x);}else{print(x-1,y,z);}}int main(){int cases=0;while(scanf("%d%d",&n,&m)==2){if(n==0&&m==0)break;memset(dp,-1,sizeof(dp));dp[0][0][delta]=0;for(int i=1;i<=n;++i){int x,y;scanf("%d%d",&x,&y);a[i]=x;b[i]=y;int d=x-y;for(int k=0;k<=m;++k)for(int j=0;j<=2*delta;++j){if(k>=1&&j>=d&&j-d<=2*delta&&dp[i-1][k-1][j-d]!=-1)if(dp[i][k][j]<dp[i-1][k-1][j-d]+x+y){dp[i][k][j]=dp[i-1][k-1][j-d]+x+y;path[i][k][j]=1;}if(dp[i-1][k][j]!=-1)if(dp[i][k][j]<dp[i-1][k][j]){dp[i][k][j]=dp[i-1][k][j];path[i][k][j]=0;}}}int minx=INT_MAX,maxx,ans1,ans2,ansi;for(int i=0;i<=2*delta;++i)if(dp[n][m][i]!=-1){if(abs(i-delta)<minx){minx=abs(i-delta);maxx=dp[n][m][i];int t=i-delta;ans1=(t+dp[n][m][i])/2;ans2=dp[n][m][i]-ans1;ansi=i;}else if(abs(i-delta)==minx){if(maxx<dp[n][m][i]){maxx=dp[n][m][i];int t=i-delta;ans1=(t+dp[n][m][i])/2;ans2=dp[n][m][i]-ans1;ansi=i;}}}printf("Jury #%d\nBest jury has value %d for prosecution and value %d for defence:\n",++cases,ans1,ans2);print(n,m,ansi);printf("\n\n");}return 0;}

0 0