/*
*/
#include <iostream>
#include <vector>
using namespace std;
const int MOD = 1000000007;
void print(const vector<int>& vec) {
for (int i=0; i<vec.size(); i++) {
cout << vec[i] << ' ';
}
cout << '\n';
}
int main() {
int n;
cin >> n;
vector<int> w(n, 0);
int max_x = 0;
for (int i=0; i<n; i++) {
cin >> w[i];
max_x += w[i];
}
vector<int> count(max_x+1);
vector<int> dp(max_x+1);
vector<int> res;
dp[0] = 1;
// add everything to the knapsack
for (int i=0; i<n; i++) {
for (int s=max_x; s>=w[i]; s--) {
dp[s] += dp[s-w[i]];
if (dp[s] >= MOD) dp[s] -= MOD;
}
}
// print(dp);
for (int i=0; i<n; i++) {
// remove w[i] from knapsack
for (int s=w[i]; s<=max_x; s++) {
dp[s] -= dp[s - w[i]];
if (dp[s] < 0) dp[s] += MOD;
}
for (int x = 0; x<=max_x; x++) {
int curr_sum = max_x - w[i] + x;
if (curr_sum < 0 || curr_sum %2 !=0) continue;
int target = (curr_sum / 2) - x;
if (target >= 0 && dp[target] > 0) {
count[x]++;
}
}
// add back w[i] to knapsack
for (int s=max_x; s>=w[i]; s--) {
dp[s] += dp[s-w[i]];
if (dp[s] >= MOD) dp[s] -= MOD;
}
}
for (int x=0; x<=max_x; x++) {
if (count[x] == n) {
res.push_back(x);
}
}
cout << res.size() << endl;
for (int i=0; i<res.size(); i++) {
cout << res[i] << " ";
}
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... |