Advertisement
Guest User

Untitled

a guest
Nov 20th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 0.97 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdbool.h>
  3.  
  4. // sums[i][2] tells us 2 things: sums[i][0] = true - sum i-1000000 exist,
  5. // and sums[i][1] = true - sum i-1000000 is addition of even number of numbers
  6. bool sums[2000001][2];
  7. bool sums2[2000001][2];
  8.  
  9.  
  10. int main(){
  11.     int n;
  12.     int p;
  13.     scanf("%d",&n);
  14.     sums[1000000][0] = true;
  15.     sums[1000000][1] = true;
  16.    
  17.     for(int i=0;i<n;i++){
  18.         scanf("%d",&p);
  19.         sums2[p+1000000][0] = true;
  20.         sums2[p+1000000][1] = true;
  21.        
  22.         for(int j=0;j<2000001;j++){
  23.             if(sums[j][0]){
  24.                 if(sums[j][1]){
  25.                     sums2[j+p][0] = sums[j][0] & sums2[p+1000000][0];
  26.                     sums2[j+p][1] = false;
  27.                 }
  28.                 else{
  29.                     sums2[j-p][0] = sums[j][0] & sums2[p+1000000][0];
  30.                     sums2[j-p][1] = true;
  31.                 }
  32.             }
  33.         }  
  34.        
  35.         for(int k=0;k<2000001;k++){
  36.             sums[k][0] = sums[k][0] | sums2[k][0];
  37.             sums[k][1] = sums[k][1] | sums2[k][1];
  38.         }
  39.        
  40.     }
  41.    
  42.     for(int i=0;i<2000001;i++){
  43.         if(sums[i][0]){
  44.             printf("%d ",i-1000000);
  45.         }  
  46.     }
  47.  
  48.     return 0;
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement