链接:https://www.nowcoder.com/acm/contest/122/G
来源:牛客网
题目描述
输入描述:
从标准输入读入数据。
输入包含多组数据,第一行一个整数 T 代表数据组数。接下来依次描述每组数据,对于每组数据:
第一行输入正整数 N,第二行输入 N 个非负整数
1≤|A|≤30 (数组 A 的长度范围在 1 到 30 之间 )
0≤A[i]≤10000 (数组 A 中的元素)
输出描述:
输出到标准输出。
对于每组数据,输出一行:
如果能划分成满足题目要求的数组 B 和 C 则输出 yes,否则输出no
输入
1 8 1 2 3 4 5 6 7 8
输出
yes
说明
样例说明:将数组 A 划分成【1,4,5,8】和【2,3,6,7】,平均数为 4.5
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define MAXN 2001000 4 #define PSIZE 100000 5 bool Average(vector<int>& A) { 6 static bool dp[2][16][300001]; 7 int sum = 0; 8 for (int a: A) sum += a; 9 10 int N = A.size(); 11 memset(dp, 0, sizeof(dp)); 12 for (int n = 0; n <= N; n++) { 13 dp[n & 1][0][0] = true; 14 } 15 for (int n = 1; n <= N; n++) { 16 for (int k = 1; k <= N/2; k++) { 17 for (int s = 1; s <= sum; s++) { 18 if (s >= A[n - 1]) { 19 dp[n & 1][k][s] = dp[n-1 & 1][k][s] || dp[n-1 & 1][k-1][s - A[n - 1]]; 20 } else { 21 dp[n & 1][k][s] = dp[n-1 & 1][k][s]; 22 } 23 } 24 } 25 } 26 for (int k = 1; k <= N/2; k++) { 27 if ((k * sum / N * N == k * sum) && dp[N & 1][k][k * sum / N]) return true; 28 } 29 return false; 30 } 31 int main(){ 32 int t; 33 while(cin>>t){ 34 while(t--){ 35 vector<int>Ve; 36 int n; 37 int num; 38 cin>>n; 39 for(int i=0;i<n;i++){ 40 cin>>num; 41 Ve.push_back(num); 42 } 43 if(Average(Ve)){ 44 cout<<"yes"<<endl; 45 }else{ 46 cout<<"no"<<endl; 47 } 48 } 49 } 50 return 0; 51 }