问题描述
对于一个整数集合,我们定义“加等式”如下:集合中的某一个元素可以表示成集合内其他元素之和。如集合{1,2,3}中就有一个加等式:3=1+2,而且3=1+2和3=2+1是相同的加等式,也是这个集合唯一的加等式。给定一个整数集合,编程找出其所有的加等式的个数。
输入格式
第一行为t,表示测试数据组数。(1≤t≤10);
接下来t行,每行表示一组测试数据。其中第一个数为m(1≤m≤30),表示集合元素的个数,接下来m个不同的整数x分别表示集合元素(1≤m≤1000)。
输出格式
对于每个输入数据,输出一个整数,表示其中加等式的个数。
输入样例
3
3 1 2 3
3 1 2 5
6 1 2 3 5 4 6
输出样例
1
0
7
样例说明
{1,2,3,4,5,6}可以分解出如下的7个等式:3=1+2;4=1+3;5=1+4;6=1+5;5=2+3;6=2+4;6=1+2+3。
代码
#include <iostream>
using namespace std;
int a[31];
int v[30001];
int main() {
//freopen("additive.in","r",stdin);
//freopen("additive.out","w",stdout);
int t, n, i, j, s, max1;
cin >> t;
while (t--) {
cin >> n;
for (i = 1; i <= 2001; i++) {
v[i] = 0;
}
for (i = 1; i <= n; i++) {
cin >> a[i];
}
v[0] = 1;
max1 = 0;
for (i = 1; i <= n; i++) {
for (j = max1; j >= 0; j--) {
if (v[j]) {
v[j + a[i]] += v[j];
}
}
max1 += a[i];
max1 = min(1000, max1);
}
s = 0;
for (i = 1; i <= n; i++) {
s += v[a[i]] - 1;
}
cout << s << endl;
}
return 0;
}