Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
Re:对标准算法提出的怀疑In Reply To:对标准算法提出的怀疑 Posted by:CZDleaf at 2011-07-22 09:52:21 我也认同你的观点。 以下是我的代码。本人水平有限。但是自认为至少正确性没有问题,是按照传统的01背包思路,i表示前i个候选人中进行选择,不过把j,k作为一个整体当做容量 #include <cstdio> #include <vector> #include <cstring> #include <algorithm> using namespace std; bool path[201][21][801]= {0}; int main(int argc, char *argv[]) { const int offset=20; int n,m,t=1; while(scanf("%d%d",&n,&m) && n||m) { memset(path,0,sizeof(path)); int DmP[201]; int DpP[201]; int dp[21][801];// 801 <- -[400...400[ <- [0...800] int sum=0; for(int i=1; i<=n; ++i) { int D,P; scanf("%d%d",&P,&D); DmP[i]=D-P+offset; DpP[i]=D+P; } memset(dp,-1,sizeof(dp)); dp[0][0]=0; for(int i=1; i<=n; ++i) { for(int j=m; j>=1; --j) { for(int k=m*(20+offset); k>=DmP[i]; --k) { if(dp[j-1][k-DmP[i]] != -1 && dp[j][k]<dp[j-1][k-DmP[i]]+DpP[i]) { dp[j][k]=dp[j-1][k-DmP[i]]+DpP[i]; path[i][j][k]=true; } } } } int dmp,dpp,d,p; for(int i=0; i<=m*offset; ++i) { if(dp[m][i+m*offset]!=-1 || dp[m][m*offset-i]!=-1) { dmp=(dp[m][i+m*offset]>dp[m][m*offset-i])?i:-i; dpp=max(dp[m][i+m*offset],dp[m][m*offset-i]); d=(dpp+dmp)/2; p=(dpp-dmp)/2; break; } } printf("Jury #%d\nBest jury has value %d for prosecution and value %d for defence:\n",t++,p,d); vector<int> ans; for(int i=n,j=m,k=dmp+m*offset; i>=1; --i) { if(path[i][j][k]) { ans.push_back(i); --j; k-=DmP[i]; } } sort(ans.begin(),ans.end()); for(int i=0;i<ans.size();++i) { printf(" %d",ans[i]); } printf("\n"); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator