이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N = 1e5 + 5;
typedef long long ll;
int n, a[205], dp1[205][50005], dp2[205][50005], sum;
vector<int> ans, vec;
int dp[205][50005];
bool us[205][50005];
bool used[50005];
bool is(int s, int v) {
    if (us[v][s])
        return dp[v][s];
    us[v][s] = 1;
    for (int i = 0; i <= s; i++) {
        if ((dp1[v - 1][i] && dp2[v + 1][s - i]) || (dp2[v + 1][i] && dp1[v - 1][s - i])) {
            dp[v][s] = 1;
            return 1;
        }
    }
    dp[v][s] = 0;
    return 0;
}
int main() {
//    freopen("bootfall.in", "r", stdin);
//    freopen("bootfall.out", "w", stdout);
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> n;
    if (n > 100) {
        cout << "SAd";
        return 0;
    }
    for (int i = 1; i <= n; i++) {
        dp[i][0] = 1;
        cin >> a[i];
        sum += a[i];
    }
    if (sum % 2 == 1) {
        cout << 0;
        return 0;
    }
    bool u = 0;
    dp1[0][0] = 1;
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j <= sum; j++) {
            if (dp1[i - 1][j]) {
                if (j + a[i] == sum / 2)
                    u = 1;
                dp1[i][j + a[i]] = 1;
                dp1[i][j] = 1;
                dp[i][j + a[i]] = 1;
            }
        }
    }
    if (u == 0) {
        cout << 0;
        return 0;
    }
    if (sum > 5e4) {
        cout << "sdf";
        return 0;
    }
    dp2[n + 1][0] = 1;
    for (int i = n; i >= 1; i--) {
        for (int j = 0; j <= sum; j++) {
            if (dp2[i + 1][j]) {
                dp2[i][j + a[i]] = 1;
                dp2[i][j] = 1;
                dp[i][j + a[i]] = 1;
            }
        }
    }
    for (int i = 0; i <= sum; i++) {
        if (dp1[n - 1][i])
            vec.push_back(i);
    }
    for (int i : vec) {
        int x = abs(i - (sum - a[n] - i));
        bool u = 0;
        for (int j = 1; j <= n; j++) {
            if ((sum - a[j] + x) % 2) {
                u = 1;
                break;
            }
            if (!is((sum - a[j] + x) / 2, j)) {
                u = 1;
                break;
            }
        }
        if (!u) {
            if (!used[x]) {
                ans.push_back(x);
                used[x] = 1;
            }
        }
    }
    cout << ans.size() << "\n";
    for (int i = ans.size() - 1; i >= 0; i--)
        cout << ans[i] << " ";
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |