TC SRM 593 DIV2 1000

很棒的DP,不过没想出,看题解了。。思维很重要。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <vector>
 5 #include <cmath>
 6 #include <algorithm>
 7 using namespace std;
 8 int dp[1000010];
 9 int sum[51];
10 class MayTheBestPetWin
11 {
12     public :
13     int calc(vector <int> A, vector <int> B)
14     {
15         int i,j,s1,s2;
16         s1 = s2 = 0;
17         memset(dp,-1,sizeof(dp));
18         dp[0] = 0;
19         for(i = 0;i < A.size();i ++)
20         {
21             sum[i] = A[i] + B[i];
22         }
23         for(i = 0;i < A.size();i ++)
24         {
25             s1 += A[i];
26             s2 += B[i];
27             for(j = 1000000;j >= sum[i];j --)
28             {
29                 if(dp[j-sum[i]] != -1&&dp[j] <= dp[j-sum[i]] + sum[i])
30                 {
31                     dp[j] = dp[j-sum[i]] + sum[i];
32                 }
33             }
34 
35         }
36         int minz = 10000000,t1,t2;
37         for(i = 1;i <= 1000000;i ++)
38         {
39             if(dp[i] != -1)
40             {
41                 t1 = abs(s1-i);
42                 t2 = abs(s2-i);
43                 minz = min(minz,max(t1,t2));
44             }
45         }
46         return minz;
47     }
48 };
原文地址:https://www.cnblogs.com/naix-x/p/3354256.html