链接:https://www.nowcoder.com/acm/contest/122/G
来源:牛客网

题目描述

阿汤同学为了准备下学期的 ACM-ICPC,刷了很多的题目,他觉得自己已经比较厉害了,于是想出个题目考考你。现在他给你一个数组 A,问你是否能将该数组划分成数组 B、C 使得 B 数组的平均数和C 数组的平均数相等,数组 B 和 C 都不能为空。

输入描述:

从标准输入读入数据。
输入包含多组数据,第一行一个整数 T 代表数据组数。接下来依次描述每组数据,对于每组数据:
第一行输入正整数 N,第二行输入 N 个非负整数

1≤|A|≤30 (数组 A 的长度范围在 1 到 30 之间 )
0≤A[i]≤10000 (数组 A 中的元素)

输出描述:

输出到标准输出。
对于每组数据,输出一行:
如果能划分成满足题目要求的数组 B 和 C 则输出 yes,否则输出no
示例1

输入

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 }