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 };

 

你可能感兴趣的:(div)