#include "bits/stdc++.h"
using namespace std;
const int mod = 2;
const int maxn = 505;
const int maxS = 2*250005;
int n;
int dp[maxS];
int a[maxn];
int ok[maxS];
// ok[x] = in how many rounds it is ok to add x
signed main(){
cin >> n;
int s = 0;
for(int i = 1;i<=n;i++) cin >> a[i],s+=a[i];
dp[0] = 1;
//Adding everything to knapsack
for(int i = 1;i<=n;i++){
for(int j = s;j>=a[i];j--){
dp[j]+=dp[j-a[i]];
if(dp[j]>=mod) dp[j]-=mod;
}
}
if(s%2==1){
cout<<0<<endl;
return 0;
}
if(dp[s/2]==0){
cout<<0<<endl;
return 0;
}
for(int i = 1;i<=n;i++){
//Deleting i from knapsack
for(int j = a[i];j<=s;j++){
dp[j]-=dp[j-a[i]];
if(dp[j]<0) dp[j]+=mod;
}
int cursum = s-a[i];
for(int new_player = 0;new_player<=2*s;new_player++){
int cursum = s-a[i]+new_player;
if(cursum%2==0&&cursum/2-new_player>=0&&dp[cursum/2-new_player]>0){
ok[new_player]++;
}
}
//Putting i back in knapsack
for(int j = s;j>=a[i];j--){
dp[j]+=dp[j-a[i]];
if(dp[j]>=mod) dp[j]-=mod;
}
}
vector<int> ans;
for(int i = 1;i<=2*s;i++){
if(ok[i]==n) ans.push_back(i);
}
cout<<ans.size()<<endl;
for(int x : ans) cout<<x<< " ";
cout<<endl;
return 0;
}
| # | 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... |