Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdbool.h>
- // sums[i][2] tells us 2 things: sums[i][0] = true - sum i-1000000 exist,
- // and sums[i][1] = true - sum i-1000000 is addition of even number of numbers
- bool sums[2000001][2];
- bool sums2[2000001][2];
- int main(){
- int n;
- int p;
- scanf("%d",&n);
- sums[1000000][0] = true;
- sums[1000000][1] = true;
- for(int i=0;i<n;i++){
- scanf("%d",&p);
- sums2[p+1000000][0] = true;
- sums2[p+1000000][1] = true;
- for(int j=0;j<2000001;j++){
- if(sums[j][0]){
- if(sums[j][1]){
- sums2[j+p][0] = sums[j][0] & sums2[p+1000000][0];
- sums2[j+p][1] = false;
- }
- else{
- sums2[j-p][0] = sums[j][0] & sums2[p+1000000][0];
- sums2[j-p][1] = true;
- }
- }
- }
- for(int k=0;k<2000001;k++){
- sums[k][0] = sums[k][0] | sums2[k][0];
- sums[k][1] = sums[k][1] | sums2[k][1];
- }
- }
- for(int i=0;i<2000001;i++){
- if(sums[i][0]){
- printf("%d ",i-1000000);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement