Question:http://poj.org/problem?id=1015
问题点:DP。
1 Memory: 1352K Time: 94MS
2 Language: C++ Result: Accepted
3
4 #include <iostream>
5 #include <vector>
6 using namespace std;
7 #define MAX_JURY 201
8 #define MAX_CHOICE 21 //人员编号从1开始
9 int dp[21][840];//21是人 840是辩控差 值是辩控和
10 vector<int> path[21][840];//值是最后一条路径
11 struct jury{
12 int minus;//辩控差
13 int sum;//辩控和
14 };
15 int main()
16 {
17 int total,choice,zero;
18 jury pool[MAX_JURY];
19 int eg = 1;
20 while(cin>>total>>choice && (total>0 && choice>0))
21 {
22 zero = 20*choice;//实际零点值
23 memset(pool,0,total);
24 for(int i=1,pi,di;i<=total;i++)
25 {
26 cin>>pi>>di;
27 pool[i].minus = di - pi;
28 pool[i].sum = di + pi;
29 }
30 memset(dp,-1,sizeof(dp));
31 for(int i=0;i<21;i++)
32 for(int j=0;j<840;j++)
33 path[i][j].clear();
34
35 dp[0][zero] = 0;
36 for(int k=1;k<=total;k++)
37 {
38 for(int i=choice;i>0;i--)//更新路径先长后短,避免交叉覆盖
39 {
40 for(int j=0;j<=2*zero;j++)
41 {
42 if(dp[i-1][j]>=0)
43 {
44 if(dp[i][j+pool[k].minus] < dp[i-1][j] + pool[k].sum)
45 {
46 dp[i][j+pool[k].minus] = dp[i-1][j] + pool[k].sum;
47 path[i][j+pool[k].minus] = path[i-1][j];
48 path[i][j+pool[k].minus].push_back(k);
49 }
50 }
51 }
52 }
53 }
54 int idx;
55 for(idx=0;dp[choice][zero-idx]==-1 && dp[choice][zero+idx]==-1;idx++);
56 int v = dp[choice][zero-idx]>dp[choice][zero+idx]?-idx:idx;
57 idx = zero + v;
58 cout << "Jury #" << eg++ <<endl;
59 cout << "Best jury has value "<<(dp[choice][idx]-v)/2<<" for prosecution and value "<<(dp[choice][idx]+v)/2<<" for defence:"<<endl;
60
61 for(int l=0;l<choice;l++)
62 {
63 cout << " "<< path[choice][idx][l] ;
64 }
65 cout<<endl;
66 }
67 return 0;
68 }