TC SRM 591 DIV2 1000

很不错的一题,非常巧妙的用DP顺序解决这个问题。。。

可以发现,只和A里面最小的有关系。。。

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <queue>

 4 #include <string>

 5 #include <vector>

 6 #include <algorithm>

 7 using namespace std;

 8 #define LL long long

 9 int dp[50*60000+1];

10 vector<int>::iterator it;

11 bool cmp(int a,int b)

12 {

13     return a > b;

14 }

15 class YetAnotherTwoTeamsProblem

16 {

17     public :

18     LL count(vector <int> skill)

19     {

20        int p[51],n,sum,i,j;

21        LL ans = 0;

22        n = skill.size();

23        sum = 0;

24        for(i = 0,it = skill.begin();i < n;i ++,it ++)

25        {

26            p[i] = *it;

27            sum += p[i];

28        }

29        sort(p,p+n,cmp);

30        if(p[0] > sum - p[0])

31        ans ++;

32        dp[0] = 1;

33        for(i = 0;i < n-1;i ++)

34        {

35            for(j = sum;j >= p[i];j --)

36            {

37                dp[j] += dp[j-p[i]];

38            }

39            for(j = 0;j <= sum;j ++)

40            {

41                if(p[i+1] + j > sum - p[i+1] - j&&j < sum-j)

42                ans += dp[j];

43                if(j >= sum - j)

44                break;

45            }

46        }

47        return ans;

48     }

49 };

 

你可能感兴趣的:(div)