很不错的一题,非常巧妙的用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 };