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;
}