제출 #1294466

#제출 시각아이디문제언어결과실행 시간메모리
1294466gsalterBootfall (IZhO17_bootfall)C++20
100 / 100
434 ms3468 KiB
/* */ #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); if (max_x%2 == 1) { cout << 0 << endl; return 0; } if (dp[max_x/2] == 0) { cout << 0 << endl; return 0; } 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 %2 == 1) 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...