http://oj.acm.zstu.edu.cn/JudgeOnline/problem.php?id=4441
题解:
首先题目中要求两个不相交的子序列数值和相等,可以等价于任意两个子序列数值和不相等。
然后可以发现他不同的子序列一共有2n 种,但是子序列的最大值为n*max(ai);
那么根据鸽巢原理可以得出来当n 大于21 的时候肯定不是一个完美序列。
对于剩下的数列可以进行暴力。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
char fre[10] = "data1.in";
char fot[10] = "data1.out";
int vis[N * 20];
//int bb[N * 20];
int v[N], teb;
void solve(){
int t;
scanf("%d", &t);
while(t--){
teb++;
int n;
scanf("%d", &n);
for(int i = 0; i < n; ++i) scanf("%d", &v[i]);
if(n > 21) puts("no");
else{
bool flag = true;
for(int gg = 1, now = 0; gg < (1 << n) && flag; ++gg){
now = 0;
for(int i = 0; i < n; ++i) if((gg >> i) & 1) now += v[i];
if(vis[now] == teb){
flag = false;
// cout << now << " " << gg << " " << bb[now] << endl;
}
vis[now] = teb;
// bb[now] = gg;
}
flag ? puts("yes") : puts("no");
}
}
}
int main()
{
solve();
// int T = 3;
// for(int cas = 1; cas <= T; ++cas){
// fre[4] = ('0' + cas);
// fot[4] = ('0' + cas);
// freopen(fre, "r", stdin);
// freopen(fot, "w", stdout);
// solve();
// }
return 0;
}